Funções nos controladores

Em CodeIgniter podemos criar controladores com diferentes nomes de funções, para dar lugar a diversas páginas que dependem do mesmo controlador.

Por Miguel Angel Alvarez - Tradução de Celeste Veiga


Publicado em: 22/8/11
Valorize este artigo:
No capítulo anterior do Manual de CodeIgniter, que vimos publicando em CriarWeb.com, estivemos explicando o que são os controladores, a parte fundamental das aplicações baseadas na arquitetura de desenvolvimento denominada MVC. Conhecer os controladores é básico e nos permitirá fazer nossos primeiros testes com este framework PHP. A continuação, explicaremos para que servem as diferentes funções ou métodos que podemos incluir nos controladores.

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.

O segundo diretório corresponde aos nomes das funções

Agora que já sabemos que o primeiro diretório depois do index.php corresponde ao nome do controlador, podemos observar o segundo diretório das URL geradas com CodeIgniter. Este se refere ao nome da função ou método que atenderá essa requisição dentro do controlador.

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.

Esclarecimento: Estamos nos referindo sempre a funções dos controladores, mas na verdade deveríamos chamá-los métodos, porque os controladores são classes e as classes têm métodos e não funções.

O terceiro diretório e os seguintes são os parâmetros enviados às funções

Agora, vamos observar outras URL que dependem do controlador de produtos, mas que têm mais de um diretório adicional ao nome do controlador. Vimos que o primeiro diretório é o controlador, o segundo o método que se invocará dentro do controlador e agora vejamos o que acontece com o terceiro parâmetro e com os seguintes, caso exista.

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.






Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato