Controllers no CodeIgniter
1 de fevereiro de 2010, em Passos Iniciais, por Tárcio Zemel
Como pudemos conferir no artigo sobre MVC, Controllers são responsáveis por controlar o fluxo dos programas, são os que contém as regras de negócio, é onde a lógica do aplicativo está. Essa foi a parte teórica sobre controllers. Agora vamos à parte prática, onde será mostrada a estrutura, função e funcionamento de um controller.
Controllers no CodeIgniter
Controllers no CodeIgniter são simplesmente arquivos com uma classe que é nomeada de forma ser associada a uma URL. Complicado? Lendo o artigo sobre URLs no CodeIgniter você vai ver que não!
Se temos, por exemplo, uma URI como http://www.site.com.br/noticias/, isso significa que a clase Noticias, contida no arquivo noticias.php, entrará em ação. Quando o nome de um controller bate com o primeiro segmento de uma URL, então esse controller é carregado.
Lembrando da estrutura de diretórios do CodeIgniter, veremos que os arquivos dos controllers devem ser colocados em application/controllers a fim de garantir uma boa organização das pastas do projeto. Há pessoas que optam por armazenar seus controllers em outros locais e há, também, a possibilidade de modularização no CodeIgniter através do uso de algumas bilbiotecas – mas esses são assuntos para artigos futuros.
Reapitulando o que consta no artigo sobre MVC, temos as seguintes características básicas de um controller:
- Define o comportamento da aplicação;
- Mapeia ações para atualizar models;
- Seleciona views para exibição;
- Deve haver um controller para cada “funcionalidade”.
Estrutura de um Controller no CodeIgniter
Assim como todo framework, o CodeIgniter possui suas regras de sintaxe, ou seja, a maneira pela qual os códigos devem ser escritos. A estrutura básica de um controller no CodeIgniter (para fins didáticos, “Noticias”) é a seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Noticias extends Controller { function Noticias() { parent::Controller(); } function index() { echo 'Olá, mundo!'; } // demais funções } |
O nome da classe deve iniciar com letra maiúscula
Perceba como está a estrutura-base do exemplo. Isso é certo:
class Noticias extends Controller { } |
Isso é errado:
class noticias extends Controller { } |
Deve haver um construtor
Basta criar uma função com o mesmo nome da classe e estender a classe Controller, como mostrado no exemplo. Se tivéssemos uma classe Matematica, ficaria:
1 2 3 4 5 6 7 | class Matematica extends Controller { function Matematica() { parent::Controller(); } } |
Sempre “parent::Controller();” deve estar presente, mas não necessariamente deve ser a única instrução. Se quiser executar algum código no construtor da classe, isso também é permitido.
O arquivo deve ter o mesmo nome da classe
Cada classe (controller) deve contar um e somente um arquivo para si. Não coloque mais de uma classe em um arquivo de controller, porque isso não vai funcionar. Em nosso controller de exemplo “Noticias”, o arquivo que o conteria seria o noticipas.php. O caminho para o arquivo seria application/controllers/noticias.php.
É possível, também, ter subpastas dentro da pasta “controllers”, a fim de melhor organizar um projeto. Nesse caso, o primeiro segmento da URL será a pasta e o segundo segmento será o controller. Então, se tivéssemos o arquivo application/controllers/produtos/eletronicos.php, o acesso a uma de suas funções – por exemplo, listar() – se daria através do endereço “http://www.site.com.br/produtos/eletronicos/listar/”.
A função index() é a primeira a ser executada
Em nosso exemplo do controller Noticias, vejam que existe uma função index(). Essa é a função que será executada quando http://www.site.com.br/noticias/ for acessado. Todas as intruções que estiverem na função index() serão executados.
Funções em um Controller no CodeIgniter
Recapitulando o que já foi visto no post sobre URLs no CodeIgniter, os parâmetros das funções em um controller também podem ser passadas via URL. Por padrão, o controller, em si, é o primeiro segmento da URL; o próximo é um função do controller; e os subsequentes, parâmetros dessa função.
Repetindo o exemplo do artigo sobre URLs, vejamos o seguinte controller:
1 2 3 4 5 6 7 | class Matematica extends Controller { function soma($x, $y) { echo $x + $y; } } |
Um belo “10″ será mostrado na tela para quem acessar http://www.site.com.br/matematica/soma/5/5.
Funções privadas em controllers
Em determinadas situações, você pode querer criar funções que não são acessíveis via URL – o método “tradicional” de acesso a funções no CI. Para fazer isso, você deve criar funções privadas (cujo nome é precedido por underscore) da seguinte forma:
function _funcaoqualquer() { // códigos } |
Tentando acessar http://www.site.com.br/noticias/_funcaoqualquer/, não vai funcionar (afinal, trata-se de uma função privada).
Definindo um Controller padrão
É possível definir um controller padrão para seu software, quer dizer, um que será executado quando, na URL, nenhum outro for indicado, ou seja, quando a aplicação for acessada, através de seu endereço principal. É como definir a “página inicial” de um software ou site.
Para especificar qual será esse controller default, acesse o arquivo application/config/routes.php e altere a diretiva $route['default_controller'] com o nome do controller desejado. Por exemplo:
$route['default_controller'] = 'Noticias'; |
Ao acessar o fictício http://www.site.com.br/, as instruções da função index() do controller Noticias serão executadas automaticamente.
E isso é tudo sobre controllers no CodeIgniter?
Não, ainda há mais coisas a respeito dos controllers no CodeIgniter. Por exemplo, já que você estende a classe nativa Controller em seus controllers, você não pode nomear suas funções com algum dos nomes reservados das funções nativas de controller do CodeIgniter.
E ainda há mais sobre controllers, recursos e técnicas que podem ser feitos para ampliar ainda mais seu poder. Mas, pode ter certeza, essa já é uma boa fonte de informação sobre controllers no CodeIgniter. Não é? ;-)
2 comentários em "Controllers no CodeIgniter"
Tárcio Zemel em 12 de fevereiro de 2010
@ thor
Ainda não tive a oportunidade de me deparar com esse tipo de problema, em específico, então não saberia o que dizer com certeza. Mas, se fosse comigo, a primeira coisa que faria é preparar todas minhas queries com Active Record para ver no que dá. Depois conta pra gente se conseguiu. Abraços!


thor em 4 de fevereiro de 2010
mto legal cara !! obrigado !!
estou estudando o ci, vc ja usou com oracle ?
eu estou tendo problemas com Query Bindings.
essa é minha função no model
function Login_rep($user,$senha)
{
$sql = ” select a.nom_conta_usuar cod,
a.flg_troca_senha flg,
a.dsc_senha_usuar pass_rep
from hbmnu_conta_usuar a
where a.nom_conta_usuar = ?
and a.flg_usuar_web = ? “;
$query = $this->db->query($sql, array($user, ‘S’));
if ($query->num_rows() > 0)
return true;
else
return false;
}
estou tentando escapar os dados do usuário e parece q tem um bug. a pagina não processa, fica em branco. não usando funções de escape funciona, mas ai o codigo fica vulneravel.
pesquisei e nao encontrei nada. q chato … :)