O Básico de Zend_Controller
O sistema Zend_Controller é projetado para ser leve, modular, e
extensível. É um projeto minimalista para permitir uma flexibilidade e alguma liberdade
para usuários enquanto provê estrutura suficiente para os sistemas construídos envolta
do Zend_Controller compartilhar algumas convenções
comuns e layout de código.
O diagrama seguinte representa o processo, e a narrativa subseqüente descreve
detalhadamente as interações:
O processo do Zend_Controller é implementado por vários
componentes. Enquanto não é necessário entender completamente os por menores de todos
estes componentes do sistema, ter um conhecimento básico do processo é útil.
Zend_Controller_Front orquestra todo o processo do
sistema Zend_Controller. Ele é o interpretador do
padrão FrontController. Zend_Controller_Front processa
todas as requisições recebidas pelo servidor e é o responsável direto pela
delegação dos pedidos dos ActionControllers
(Zend_Controller_Action).
Zend_Controller_Request_Abstract (muitas vezes chamado
de Request Object) representa o ambiente de pedido e
fornece métodos para colocação e recuperação do controlador e nomes de ações
e qualquer parâmetros passados. Adicionalmente ele guarda o registro de que a
ação foi despachada ou não pelo
Zend_Controller_Dispatcher. Extensões do objeto de
requisição abstrata podem ser usadas para encapsular todo o ambiente de
requisição, permitindo aos roteadores colocarem informações no ambiente de
requisição para estabelecer o controlador e nomes de ação.
Por padrão, Zend_Controller_Request_Http é usado, para
fornecer acesso a todo o ambiente de pedido de HTTP.
Zend_Controller_Router_Interface é usado para definir
os roteadores. Roteamento é o processo de examinação da requisição do ambiente
para determinar qual controlador e ação do controlador, devem receber a
requisição. Este controlador, ação e parâmetros opcionais são incluídos no
objeto de requisição para serem processados pelo
Zend_Controller_Dispatcher_Standard. O roteamento
ocorre somente uma vez: quando a requisição é inicialmente recebida e antes
do primeiro controlador ser despachado.
O roteador padrão, Zend_Controller_Router_Rewrite, pega
uma URI no ponto especificado em
Zend_Controller_Request_Http e a decompõe em um
controlador, ação e parâmetros baseado na informação do caminho da
URL. Por exemplo, a URL
http://localhost/foo/bar/key/value pode ser decomposta
para usar o controlador foo, a ação
bar, e o parâmetro especificado key
com o valor igual a value.
Zend_Controller_Router_Rewrite também pode ser usado
para combinar caminhos arbitrários; veja a documentação do roteador
para mais informações.
Zend_Controller_Dispatcher_Interface é usado para
definir despachantes. Despachar é o processo de pegar o controlador e a ação
do objeto de requisição e mapeá-lo para um arquivo de um controlador (ou
classe) e método de ação na classe do controlador. Se o controlador ou ação
não existir, ele determina o controlador e ação padrão para despachar.
O processo atual de despacho consiste em instanciar a classe do controlador e
chamar o método de ação nesta classe. Diferente do roteamento, que ocorre
somente uma vez, o despacho ocorre em um laço. Se o status do objeto de
requisição despachado é reiniciado em algum ponto, o laço irá se repetir,
chamando qualquer ação atualmente estabelecida no objeto de requisição. A
primeira vez que o laço do objeto de requisição terminar com o status ativado
(BooleanTRUE), ele irá finalizar
o processo.
O despachador padrão é o
Zend_Controller_Dispatcher_Standard. Ele define os
controladores como MixedCasedClasses terminados com a palavra Controller, e os
métodos de ações como camelCasedMethods terminadas com a palavra Action:
FooController::barAction(). Neste caso, o controlador
será chamado como foo e a ação como
bar.
Convenções de Nomenclatura para Maiúsculas e Minúsculas
Desde que os seres humanos são notoriamente incapazes de preservar
maiúsculas e minúsculas ao digitar links, o Zend Framework atualmente
normaliza as informações sobre o caminho para minúsculas. Isto,
naturalmente, afetará a forma como você nomeia o seu controlador e suas
ações... ou referir-se a eles em links.
Se você deseja que o nome de seu controlador de classe ou do método de ação
tenham múltiplas MixedCasedWords ou camelCasedWords, você precisará, para
separar as palavras na url, um '-' ou '.' (embora você pode configurar o
caractere utilizado).
Por exemplo, se você estava indo para a ação em
FooBarController::bazBatAction(), você irá se
referir a ela em uma url como /foo-bar/baz-bat ou
/foo.bar/baz.bat.
Zend_Controller_Action é o componente base do
controlador de ação. Cada controlador é uma classe única que extende a classe
Zend_Controller_Action e deve conter um ou
mais métodos de ação.
Zend_Controller_Response_Abstract define a classe básica
de resposta usada para coletar e retornar repostas dos controladores de ação.
Ela coleta tanto cabeçalhos como conteúdos de corpo.
A classe de resposta padrão é
Zend_Controller_Response_Http, que é conveniente para
uso em um ambiente HTTP.
O processo do Zend_Controller é relativamente simples. Uma
requisição é recebida pelo Zend_Controller_Front, que por sua vez
chama Zend_Controller_Router_Rewrite para determinar qual
controlador (e ação deste controlador) será chamado.
Zend_Controller_Router_Rewrite decompõe o URI
para poder determinar os nomes do controlador e da ação da requisição.
Zend_Controller_Front então entrar em um laço de despacho. Ele
chama Zend_Controller_Dispatcher_Standard, passando-lhe a
requisição, para ser despachada para o controlador e ação especificados na requisição (ou
usa os padrões). Depois que o controlador termina, o controle retorna para
Zend_Controller_Front. Se o controlador indicar outro controlador
para ser despachado através do reinicio do status de requisição, o laço continua e outro
despacho é executado. De outra maneira, o processo termina.