Controllers no CodeIgniter

1 de fevereiro de 2010, em Passos Iniciais, por

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 CI_Controller {
 
    function __construct()
    {
        parent::__construct();
    }
 
    public function index()
    {
        echo 'Olá, mundo!';
    }
 
    // demais funções
}

Perceba a sutileza: o método construtor é o que inicia a classe; o index() é o que é chamado por default, caso nenhum outro o seja.

O nome da classe deve iniciar com letra maiúscula

Perceba como está a estrutura-base do exemplo. Isso é certo:

class Noticias extends CI_Controller {
}

Isso é errado:

class noticias extends CI_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
8
class Matematica extends CI_Controller {
    function __construct()
    {
        parent::__construct();
    }
 
    [...]
}

Sempre “parent::__construct();” 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
8
class Matematica extends CI_Controller {
    [...]
 
    public 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:

private 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 base sobre controllers no CodeIgniter.

19 comentários em "Controllers no CodeIgniter"

gravatar

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 … :)

gravatar

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!

gravatar

David Ciasca  em 9 de agosto de 2010

estou acompanhando o Blog… só tenho que agradecer pelo otimo conteudo e explicações de cada topico. Parabens, vcs estao ajudando e muito, espero aprender e poder ajudar outros em breve.

gravatar

Tárcio Zemel  em 26 de agosto de 2010

Que bom que está acompanhando e gostando, David! Esperamos você nos próximos artigos e parabéns para você pela iniciativa de querer compartilhar os conhecimentos!

gravatar

wallysson  em 22 de outubro de 2010

Oi Tárcio, Curti muito o tutorial, ams estou com uma dúvida cara, caso eu queri colocar os controllers dentro de 2 pastas, é possível?

Tenho tentado… Mas não estou tendo um bom resultado…. Esta dando alguns erros e tals.. Teria como ajudar?

O CI, diz não ter encontrado o a página…

gravatar

Tárcio Zemel  em 23 de outubro de 2010

Que bom que está gostando, David! Assine o feed do blog para acompanhar os novos artigos e, qualquer sugestão, basta dizer!

Abraços!

gravatar

Tárcio Zemel  em 23 de outubro de 2010

Wallyson, apesar de não constar nada no User Guide oficial, a experiência mostra que mais de 2 subníveis de controllers já começa a dar problema no CI…

Eu, mesmo, nunca precise de tamanha especificidade, mas, para os casos em que diversos subníveis de pastas de controllers são necessários, experimente esta solução: Multi Level Subfolder Controller in CodeIgniter.

Se der certo, mesmo, volta, aí, e conta pra gente! ;-)

gravatar

Carlos Silva  em 30 de junho de 2012

Ola! amigo estou começando a estudar o CI, e acabei encontrando seu site quero lhe parabenizar pelos artigos estou aprendendo muito.

gravatar

Alencar  em 4 de dezembro de 2012

Boa tarde Tárcio, estou começando a programar com o CI agora e gostei muito do material disponível em seu site. Estou com uma dúvida em questão aos controllers, veja se pode me ajudar:
1º -> Criei uma pasta chamada "painel" dentro da pasta Controllers, nesta pasta painel adicionei o controller "home.php" e defini o default_controller como "home", porem quando tento acessar: site.com.br/painel ele não vai automaticamente para o home, eu tenho que digitar: site.com.br/painel/home. Sabe me dizer se o default_controller funciona nas sub-pastas também?

Agradeço desde já.

gravatar

Alencar  em 4 de dezembro de 2012

Tárcio, consegui resolver aqui, alterei o default_controller para: painel/home.
Estava pensando que o default_controller era como o método padrão de um controller, no caso, o index.

Novamente, parabéns pelo Blog.

gravatar

Tárcio Zemel  em 7 de dezembro de 2012

Que bom, então, Alencar, é isso, mesmo!

Lembrando que é possível alterar esse comportamento padrão através de rotas.

Abraços!

gravatar

Sistema Financeiro  em 20 de fevereiro de 2015

Hey Tárcio, Obrigado
achei o teu o melhor artigo que li hoje!
Abraço

gravatar

Ayamae  em 20 de setembro de 2015

This one is the best.PlayStation Move Starter BundleProduct Features * Bundle hardware is ciplatobme optional hardware, sold separately, including additional Move motion controllers, the Move navigational controller and the PlayStation Move charging station * Affordable starter bundle for the Sony’s motion-controlled gaming system, PlayStation Move * Includes the PlayStation Move components, the PlayStation Move motion controller and PlayStation Eye camera peripheral, together allowing for the playing of any PlayStation Move game * The PlayStation Move motion controller features standard PlayStation navigational button for easy in-game movement * Includes a copy of the Multiplayer PlayStation Move game, Sports Champions

gravatar

Danilo  em 1 de janeiro de 2016

ola, tudo bem?
gostei muito do seu site e queria tirar uma duvida, estava tentando fazer o meu "ola Mundo"
mas estou recebendo sempre um erro 404
meu código está assim:
nome: funcao.php
<?php
class Funcao extends CI_Controller{

function __construct(){
parent::__construct();
}

public function index(){

$this->load->view('welcome_message');
}
}

já fiz de tudo e nada de sair do erro 404, vê algum erro ai?

Comente!