O que é um Codeigniter Controller?

Neste artigo vamos falar sobre controllers do CodeIgniter. O CodeIgniter é baseado no modo de desenvolvimento Model-View-Controller. A MVC é uma abordagem de software que realiza a separação da lógica da aplicação de sua apresentação. Em prática, permite que nossas páginas web contenham o mínimo de script, já que a apresentação é separada do PHP.

Controller: Serve como um intermediário entre o Model, a View, e qualquer outro recurso necessário para processar a requisição HTTP e gerar a página web.

Com o CodeIgniter temos uma abordagem mais solta em relação ao MVC, já que models não são obrigatórios. Se não precisarmos desta facilidade, ou acharmos que manter models gerará mais complexidade do que queremos ou precisamos, podemos ignorá-los e construir nossas aplicações apenas usando Controllers e Views. O CodeIgniter também permite que possamos incorporar nossos próprios scripts, ou mesmo desenvolvermos bibliotecas para o sistema, nos possibilitando trabalhar de um modo que faça mais sentido para nós.

Controllers no Codeginiter

No CodeIgniter os controllers são o coração das nossas aplicações, pois determinam como as requisições HTTP devem ser trabalhadas.

O que é um controller?

Um controller é simplesmente um arquivo de classe que é nomeado de uma forma que possa ser associado a uma URL.

Vamos considerar a seguinte URL: http://localhost/post/index.php/inicial.

Neste exemplo, o CodeIgniter tentará encontrar um controller chamado “inicial.php” e o carregará

Quando um nome de um controller bater com o primeiro seguimento da URL, ele será carregado.

Testando o controller no codeigniter

Vamos agora criar um simples controller para que possamos vê-lo em ação. Crie um script chamado “inicial.php” e coloque nele o seguinte código.

Listagem 1: Exemplo controller simples


<?php
	class Inicial extends CI_Controller
	{
		function index()
		{
			echo'Controller exemplo';
		}
	}
?>

Salve esse arquivo dentro da pasta “application/controllers/”.

Deve ser exibido o seguinte resultado no navegador.

Resultado Controller simples

Figura 1: Resultado Controller simples

É recomendável que o nome das classes controllers inicie com letra maiúscula, conforme o exemplo a seguir.

Listagem 2: Nome de classe da forma recomendada


<?php
	class Inicial extends CI_Controller
?>

E neste outro modo está incorreta.

Listagem 3: Nome de classe da forma não recomendada


<?php
	class inicial extends CI_Controller
?>

E também sempre temos que ter certeza que nosso controlador estenda o controller pai, para que possa herdar todas as funções deste.

Funções do controller codeigniter

No exemplo anterior que criamos, o nome da função é index(). A função “index” é sempre carregada por default se o segundo segmento do URL estiver vazio. Outra maneira de mostrarmos nossa mensagem “Controller exemplo”, poderia ser esta: http://localhost/post/index.php/inicial/index.

A segunda parte do seguimento da URL determina qual função no controller é chamada, vamos testar isso com o seguinte exemplo. Vamos adicionar a seguinte função dentro do nosso controller.

Listagem 4: Adicionando função comments no Controller

 
<?php
	class Inicial extends CI_Controller
	{
		function index()
		{
			echo'Controller exemplo';
		}
		function comments ()
		{
			echo'Mensagem alternativa';
		}
	}
?>

Agora carregue sua URL parecida com a seguinte para ver a função comments:

http://localhost/post/index.php/inicial/comments.

Exemplo mensagem alternativa função comments

Figura 2: Exemplo mensagem alternativa função comments

Definindo o controller Default

Ao CodeIgniter podemos dizer para carregar o controller default quando não estiver explícito na URL, pois este será o caso quando apenas a URL raiz do nosso site é requisitada. Para especificarmos um controller default, vamos abrir o arquivo “application/config/routes.php” e alterarmos a seguinte variável.

Listagem 5: Definindo controller Default


$route['default_controller'] = "Inicial";

Onde inicial é o nome da classe controller que queremos usar. Agora se carregarmos nosso index.php geral, sem especificarmos nenhum segmento na URL, veremos a mensagem “Controller Exemplo”: http://localhost/post/index.php/.

Index sem segmento

Figura 3: Index sem segmento

Remapeando a chamada funções

Como podemos notar acima, o segundo segmento da URL tipicamente indica qual função no controller será chamada. O CodeIgniter nós permite sobrepor este comportamento através do uso da função _remap().

Importante: se nosso controller contiver uma função chamada _remap(), ela sempre será chamada independente do que a nossa URL contenha. Ela sobrepõe o comportamento normal no qual a URL determina qual função será chamada, nos permitindo definir nossas próprias regras de roteamento de funções.

A chamada de função sobreposta (tipicamente o segmento do URL) será passada com um parâmetro à função _remap().

Listagem 6: Sintaxe da função _remap()


<?php
class Inicial extends CI_Controller {		
  function _remap($method){
    // chama a função gravar() somente se o método
    // for "excluir"
    if($method == "excluir")
      $this->gravar();
    else
      $this->index();
  }
	
  function index(){
    echo "Está é a página principal";
  }
	
  function gravar(){
    echo "Sou a função gravar";
  }
	
  function excluir(){
    echo "Sou a função excluir";
  }
}
?>

Nesse exemplo, sempre que utilizarmos o seguimento da URL “excluir”, a função chamada sempre será “gravar” : http://localhost/post/index.php/inicial/excluir.

Mapeando chamada de função

Figura 4: Mapeando chamada de função

Funções privadas

Em alguns casos, podemos querer que certas funções não sejam acessadas publicamente. Para criarmos uma função privada, simplesmente adicionamos um underscore como prefixo do nome e ela não será servida via requisição URL, por exemplo, se tivermos uma função como a seguir.

Listagem 7: Função privada


  function _utility()
  {
	echo "Testando função privada";
  }

E se tentarmos acessa-la via requisição URL dessa forma, não funcionará:

http://localhost/post/index.php/inicial/_utility

Contrutores de classes

Se pretendermos utilizar um construtor em algum de nossos controlers, devemos colocar a seguinte linha de código: Parent::Controller().

A razão para esta linha ser necessária é porque nosso construtor local irá sobrepor aquele na classe controller pai, por isso a necessidade de chamarmos manualmente.

Se não estamos familiarizados com construtores no PHP4, um construtor é simplesmente uma função que tem o mesmo nome da classe e que é executada para criar uma instância desta.

Listagem 8: Construtor de classe


<?php
class Inicial extends CI_Controller {	
	function Inicial ()
	{
	parrent::Controller();
	}
?>

Agora no PHP5 usamos a seguinte sintaxe.

Listagem 9: Construtor de classe PHP5

 

<?php
class Inicial extends CI_Controller {	
	function construct ()
	{
	parrent::Controller();
	}
}
?>

Construtores são muito úteis se desejamos definir alguns valores default ou executar um processo default enquanto uma classe é instanciada. Construtores não podem retornar um valor, mas podem executar algum trabalho default.

Organizando controllers codeigniter em subdiretórios

Se estivermos criando uma aplicação grande, podemos achar conveniente organizar os controllers em subdiretórios. O CodeIgniter nos permite que façamos isso. Simplesmente temos que criar subdiretórios em nosso diretório application/controllers e colocarmos nossos controllers dentro.

Observação: ao utilizamos esse recurso, o primeiro segmento da nossa URL precisará especificar o diretório. Por exemplo ,digamos que tenhamos um controller localizado assim: Apllication/controllers/artigos/ci.php.

Para conseguirmos chamar esse controller, nossa URL ficará parecida com a seguinte: http://localhost/post/index.php/artigos/ci.

Cada um de nossos subdiretórios poderá conter um controller default que será chamado se a URL contiver apenas um subdiretório. Simplesmente precisamos renomear nosso controller default no arquivo application/config/routes.php.

Nomes reservados de funções

Já que nossas classes controllers irão estender o controller principal da aplicação, precisamos tomar cuidado em não nomeá-las de forma idêntica àquelas usadas pela principal, caso contrário, nossas funções locais irão sobrescrevê-las. Seguie abaixo uma lista de nomes reservados. Não renomeie suas funções como uma destas:

  • Controller
  • CI_Base
  • _ci_initialize
  • _ci_scaffolding

E se caso estivermos rodando PHP4, ainda há nomes adicionais. Estes se aplicam apenas se estivermos utilizando PHP4:

  • Ci_Loader
  • Config
  • Database
  • File
  • Helper
  • Helpers
  • Language
  • Library
  • Model
  • Plugin
  • Plugins
  • Scaffolding
  • Script
  • View
  • Vars
  • _ci_assign_to_models
  • _ci_autoloader
  • _ci_init_class
  • _ci_initscaffolding
  • _ci_is_instace
  • _ci_load
  • _ci_load_class
  • _ci_object_to_array

Assim concluimos mais este artigo, resumidamente é isso que necessitamos saber sobre controllers. Espero que o artigo tenha sido de fácil compreensão a todos.

Links Úteis

Saiba mais sobre PHP ;)

  • Documentação: PHP: While e Do While:
    Este documento apresenta as estruturas de repetição while e do while, recursos que possibilitam executar trechos de código repetidamente com base em uma expressão booleana.
  • Como implementar o MVC em PHP:
    O padrão MVC é amplamente utilizado no desenvolvimento de aplicações web, e saber implementá-lo é importante para trabalhar de forma eficiente com frameworks como CodeIgniter e Laravel, bem como para desenvolver projetos sem depender dessas soluções de terceiros.
  • Documentação: PHP: Declaração e atribuição de variáveis:
    Neste documento você encontrará o conteúdo que precisa para aprender a declarar e utilizar variáveis na linguagem PHP. É por meio das variáveis que conseguimos guardar os dados em memória e acessá-los quando necessário.