CodeIgniter dispõe de um mecanismo simples para dar apoio a URLs diferentes que dependem do mesmo controlador. Ou seja, podemos associar muitas páginas a um controlador, com URL distintas, que são executadas chamando sempre a um mesmo controlador.
Por exemplo, pensemos que temos uma loja online de venda de produtos de informática. Então poderíamos ter uma URL onde se mostram os produtos, mas ao mesmo tempo teremos muitas classificações de produtos e cada cliente poderia ver uma ficha completa com cada um deles. Todas as fichas de produtos poderiam ser colocadas dentro de um mesmo controlador, dando lugar a diferentes URL, como podem ser as seguintes:
dominio.com/index.php/produtos
dominio.com/index.php/produtos/computadores
dominio.com/index.php/produtos/monitores
dominio.com/index.php/produtos/perifericos/mouse_genius
dominio.com/index.php/produtos/computadores/mac_mini/2gigas
dominio.com/index.php/produtos/computadores/mac_mini/4gigas
...
Todas estas URL dependem do mesmo controlador, que seria o controlador de produtos (como foi dito no artigo anterior, seria a classe "Produtos" que estende a classe "Controller" e devemos colocar no arquivo "produtos.php" dentro do diretório onde são colocados os controladores (application/controllers).
Como se pode ver, o primeiro nome do diretório depois do domínio e do index.php é o nome do controlador, neste caso sempre "produtos". Por isso todas as URL que tínhamos antes dependem do mesmo controlador. No entanto, as URL que coloquei aqui são um mero exemplo, para que se possa ver como podem ser geradas URLs que dependem de um mesmo controlador. Porém, dependendo de como desejemos organizar nosso website poderíamos decidir fazer uso de outras URL para mostrar mais ou menos o mesmo. O bom, como também se pode comprovar vendo essas URL, é que em CodeIgniter sempre são geradas URLs sem passo de parâmetros, ou seja, sempre totalmente amistosas a motores de busca.
Se não é indicado nenhum nome de função, CodeIgniter sempre invoca a função chamada index(), assim, a URL:
dominio.com/index.php/produtos
Será processada pela função index() que coloquemos no controlador. Este é um caso especial, porque não se indicou nome de função, mas foram dadas URLs como estas:
dominio.com/index.php/produtos/computadores
dominio.com/index.php/produtos/monitores
Teremos que gerar tais funções no controlador, como pode ser visto no seguinte código:
<?php
class Produtos extends Controller {
function index(){
echo 'Isto é a portada de produtos';
}
function computadores(){
echo 'Aqui se mostram os produtos de computadores';
}
function monitores(){
echo 'Aqui se mostram os produtos de monitores';
}
}
?>
Como se pode ver, criamos duas novas funções dentro de um controlador para produtos, para poder mostrar dois tipos de produtos diferentes.
dominio.com/index.php/produtos/perifericos/mouse_genius
dominio.com/index.php/produtos/computadores/mac_mini/2gigas
dominio.com/index.php/produtos/computadores/mac_mini/4gigas
Estes diretórios adicionais são simples parâmetros nos métodos do controlador. Assim, por exemplo, a primeira das URL que acabamos de ver se corresponde com o método "perifericos", passando-lhe o nome do periférico que se deseja ver "mouse_genius". Este dado adicional pode ser recebido no método com um código como este:
function perifericos($modelo){
echo ' você está vendo o periférico ' . $modelo;
}
Assim, temos o método "perifericos" que recebe o parâmetro modelo. Este parâmetro tomará o valor do terceiro diretório. Então na URL:
dominio.com/index.php/produtos/perifericos/mouse_genius
Estaremos invocando o método perifericos() e passando como valor no parâmetro $modelo a cadeia "mouse_genius".
Isto se pode complicar um pouco mais em URL como estas:
dominio.com/index.php/produtos/computadores/mac_mini/2gigas
Como se pode comprovar, aqui estamos passando dois parâmetros ao método computadores() do controlador "Produtos", que poderíamos processar de uma maneira similar a esta:
function computadores($marca=null, $modelo=null){
if (is_null($marca) && is_null($modelo)){
echo 'Aqui se mostram os produtos de computadores';
}elseif(is_null($modelo)){
echo 'Mostrando computadores de marca ' . $marca;
}else{
echo 'Mostrando computadores de marca ' . $marca . ' e modelo ' . $modelo;
}
}
Na função anterior se comprova que parâmetros são recebidos no método antes de dar por certo que estamos recebendo algum deles. Processará corretamente URLs como estas:
http://localhost/index.php/produtos/computadores
http://localhost/index.php/produtos/computadores/toshiba
http://localhost/index.php/produtos/computadores/hp/pavillon590
Com tudo o que vimos até agora de controladores, temos este código no arquivo "produtos.php" do diretorio "controllers".
<?php
class Produtos extends Controller {
function index(){
echo 'Isto é a portada de produtos';
}
function computadores($marca=null, $modelo=null){
if (is_null($marca) && is_null($modelo)){
echo 'Aqui se mostram os produtos de computadores';
}elseif(is_null($modelo)){
echo 'Mostrando computadores de marca ' . $marca;
}else{
echo 'Mostrando computadores de marca ' . $marca . ' e modelo ' . $modelo;
}
}
function monitores(){
echo 'Aqui se mostram os produtos de monitores';
}
function perifericos($modelo){
echo ' Você está vendo o periférico ' . $modelo;
}
}
?>
Esperamos que com o que se sabe até o momento possam ser feitos os primeiros testes com controladores em CodeIgniter. Contudo, há que dizer que ainda não vimos tudo com relação aos controladores; o deixaremos para o próximo artigo.