Controllers
Controllers são o coração da sua aplicação, pois determinam como as requisições HTTP devem ser tratadas.
- O que é um Controller?
- Hello World
- Funções
- Passando segmentos URI para suas funções
- Definindo um Controller Default
- Remapeando Chamadas de Função
- Controlando os Dados de Saída
- Funções Privadas
- Organizando Controllers em Subdiretórios
- Construtores de Classes
- Nomes Reservados de Funções
O que é um Controler?
Um Controller é simplesmente um arquivo de classe que é nomeado de uma forma em que possa ser associado a uma URI.
Considere este URI:
www.seu-site.com/index.php/blog/
No exemplo acima, o Code Igniter tentará encontrar um controller chamado blog.php e o carregará.
Quando um nome de um controller bate com o primeiro segmento do URI, ele será carregado.
Vamos experimentar: Hello World!
Vamos criar um simples controller para que você possa vê-lo em ação. Usando um editor de texto, crie um arquivo chamado blog.php e escreva nele o seguinte código:
Então salve o arquivo no seu diretório application/controllers/.
Agora, visite o seu site usando uma URL parecida com esta:
www.seu-site.com/index.php/blog/
Se você fez certo, deverá ver o seguinte: Hello World!.
Note: Nomes de Classes devem começar com uma letra maiúscula. Em outras palavras, isto é válido:
<?php
class Blog extends Controller {
}
?>
E isto não é válido:
<?php
class blog extends Controller {
}
?>
E também sempre tenha certeza que seu controller estenda o controller pai para que possa herdar todas as funções deste.
Funções
No exemplo acima, o nome da função é index(). A função "index" é sempre carregada por default se o segundo segmento do URI estiver vazio. Outro jeito de mostrar sua mensagem "Hello World" poderia ser este:
www.seu-site.com/index.php/blog/index/
A segunda parte do segmento do URI determina qual função no controller é chamada.
Vamos tentar isto. Adicione uma nova função ao seu controller:
Carregue agora a seguinte URL para ver a função comment:
www.seu-site.com/index.php/blog/comments/
Você deverá ver sua nova mensagem.
Pasando Segmentos UTI para suas Funções
Se seus URI contêm mais de 2 segmentos, eles serão passados à suas funções como parâmetros.
Por exemplo, digamos que você tenha um URI como este:
www.seu-site.com/index.php/produtos/sapatos/sandalias/123
Para sua função serão passados os segmentos URI 3 e 4 ("sandalias" e "123"):
<?php
class Products extends Controller {
function shoes($sandalias, $id)
{
echo $sandalias;
echo $id;
}
}
?>
Importante: Se você está usando o recurso URI Routing, os segmentos passados à suas funções serão aqueles previamente roteados (re-routed).
Definindo um Controller Default
Ao Code Igniter pode ser dito para carregar o controller default quando um URI não está presente, pois este será o caso quando apenas a URL raiz do seu site é requisitada. Para especificar um controller default, abra seu arquivo application/config/routes.php e altere esta variável:
$route['default_controller'] = 'Blog';
Onde Blog é o nome do classe controller que você quer usar. Se você carregar agora seu index.php geral, sem especificar qualquer segmento URI, verá sua mensagem "Hello World".
Remapeando Chamadas de Funções
Como notado acima, o segundo segmento do URI tipicamente determina qual função no controller será chamada. Code Igniter permite que você sobreponha este comportamente através do uso da função _remap():
function _remap()
{
// Algum código aqui
}
Importante: Se seu controller contém uma função chamada _remap(), ela sempre será chamada independente do seu URI contenha. Ela sobrepôe o comportamente normal no qual o URI determina qual função será chamada, permitindo que você defina suas próprias regras de roteamento de funções.
A chamada de função sobreposta (tipicamente o segundo segmento do URI) será passado como um parâmetro à função _remap():
function _remap($metodo)
{
if ($metodo == 'algum_metodo')
{
$this->$metodo();
}
else
{
$this->metodo_default();
}
}
Processando a Saída
O Code Igniter tem uma classe de saída que toma conta de enviar os dados renderizado finais ao web browser automaticamente. Mais informações sobre isto pode ser encontrado nas páginas Views e Classe Saída. Em alguns casos, no entanto, você pode preferir pós-processar os dados finalizdos e então enviar para o browser você mesmo. Code Igniter permite que você adicione uma função chamada _output() em seu controller que irá receber os dados de saída finalizados.
Importante: Se seu controller contém uma função chamada _output(), ela sempre será chamada pela classe Saída no lugar de dar echo diretamente nos dados finalizados. O primeiro parâmetro desta função conterá a saída finalizada.
Aqui está um exemplo:
function _output($output)
{
echo $output;
}
Por favor, note que sua função _output() irá receber os dados em seu estado final. Benchmark e dados de uso de memória serão renderizados, arquivos de cache serão escritos (se o cache estiver habilitado) e cabeçalhos serão enviados (se você usar tal recurso) antes que sejam entregues à função _output(). Se você está usando este recurso, o temporizador de execução da página e as estatísticas de uso de memória poderão não ser perfeitamente precisos pois eles não serão considerarão qualquer processamento adicional que você fizer. Para uma forma alternativa de controlar a saída antes que qualquer processamento final é feito, por favor veja os métodos disponíveis na Classe Output.
Funções Privadas
Em alguns casos, você pode querer que certas funções não sejam acessas publicamente. Para fazer uma função privada, simplesmente adicione um underscore como prefixo do nome e ela não será servida via requisação URL. Por exemplo, se você tiver uma função como esta:
function _utility()
{
// algum código
}
Tentar acessá-la via URL, da seguinte forma, não funcionará:
www.seu-site.com/index.php/blog/_utility/
Organizando seus Controllers em Subdiretórios
Se você está construindo uma aplicação grande, pode achar conveniente organizar seus controllers em sub-diretórios. Code Igniter permite que o faça.
Simplesmente crie subdiretórios em seu diretório application/controllers e coloque seuas classe controllers dentro deles.
Note: Utilizando-se este recurso, o primeiro segmento de seu URI precisará especificar o diretório. Por exemplo, digamos que você tenha um controller localizado aqui:
application/controllers/produtos/sapatos.php
Para chamar o controle acima, seu URI irá se parecer com isto:
www.seu-site.com/index.php/produtos/sapatos/123
Cada um de seus subdiretórios poderá conter um controller default que será chamado se a URL contiver apenas um subdiretório. Simplesmente nomeie seu controller default como espeficiado em arquivo application/config/routes.php.
Code Igniter também lhe permite remapear seus URIs usando seu recurso Roteamento URI.
Construtores de Classes
Se você pretende usar um construtor em algum de seus Controllers, você DEVE colocar a seguinte linha de código nele:
parent::Controller();
A razão para esta linha ser necessária é porque seu construtor local irá sobrepor aquele na classe controller pai, por isto precisamos chamá-la manualmente.
Se você não está familirizado com construtores (constructors), em PHP 4, um construtor é simplesmente uma função que tem o mesmo nome da classe:
<?php
class Blog extends Controller {
function Blog()
{
parent::Controller();
}
}
?>
Em PHP 5, construtores usam a seguinte sintaxe:
<?php
class Blog extends Controller {
function __construct()
{
parent::Controller();
}
}
?>
Construtores são úteis se você precisa definir alguns valores default, ou rodar um processo default enquanto sua classe é instanciada. Construtores não podem retornar um valor, mas podem executar algum trabalho default.
Nomes Reservedos de Funções
Já que suas classes controller irão estender o controller principal da aplicação, você precisa tomar cuidado em não nomeá-las de forma idêntica àquelas usadas pela principal, caso contrário suas funções locais irão sobrescrevê-las. Abaixo, uma lista de nomes reservados. Não nomeie suas funções como uma destas:
- Controller
- CI_Base
- _ci_initialize
- _ci_scaffolding
Se estiver rodando PHP 4, ainda há alguns nomes adicionais. Estes se aplicam SOMENTE se você estiver rodando PHP 4.
- 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_init_scaffolding
- _ci_is_instance
- _ci_load
- _ci_load_class
- _ci_object_to_array
É isto!
Resumidamente, isto é tudo que precisa saber sobre controllers.