Capítulo 12. Zend_Controller

Índice

12.1. Zend_Controller Quick Start
12.1.1. Introdução
12.1.2. Quick Start
12.1.2.1. Criando o Layout do Sistema de Arquivo
12.1.2.2. Configure o Document Root
12.1.2.3. Criando Regras Rewrite
12.1.2.4. Criando o Arquivo Bootstrap
12.1.2.5. Criando o Controle de Açao Padrão - (Action Controller)
12.1.2.6. Criando o View Script
12.1.2.7. Criando o Error Controller (Controle de Erro)
12.1.2.8. Visualizando o Site!
12.2. Básico - Zend_Controller
12.3. O Front Controller
12.3.1. Visão Geral
12.3.2. Métodos Primários
12.3.2.1. getInstance()
12.3.2.2. setControllerDirectory() e addControllerDirectory
12.3.2.3. addModuleDirectory() e getModuleDirectory()
12.3.2.4. dispatch()
12.3.2.5. run()
12.3.3. Métodos de Acesso
12.3.4. Parâmetros - Controller Parameters
12.3.5. Estendendo o Front Controller
12.4. Requisição Objeto
12.4.1. Introdução
12.4.2. Requisições HTTP
12.4.2.1. Acessando Dados das Requisições
12.4.2.2. UrL Base e Sub-Diretórios
12.4.2.3. Determinando o Método da Requisição
12.4.2.4. Detectando Requisições AJAX
12.4.3. Subclassing the Request Object
12.5. The Standard Router
12.5.1. Introduction
12.5.2. Using a Router
12.5.3. Basic Rewrite Router Operation
12.5.4. Default Routes
12.5.5. Base URL and Subdirectories
12.5.6. Global Parameters
12.5.7. Route Types
12.5.7.1. Zend_Controller_Router_Route
12.5.7.1.1. Variable Defaults
12.5.7.1.2. Variable Requirements
12.5.7.1.3. Translated segments
12.5.7.2. Zend_Controller_Router_Route_Static
12.5.7.3. Zend_Controller_Router_Route_Regex
12.5.7.4. Zend_Controller_Router_Route_Hostname
12.5.7.5. Zend_Controller_Router_Route_Chain
12.5.7.5.1. Chain Routes via Zend_Config
12.5.7.6. Zend_Rest_Route
12.5.7.6.1. Zend_Rest_Controller
12.5.8. Using Zend_Config with the RewriteRouter
12.5.9. Subclassing the Router
12.6. The Dispatcher
12.6.1. Overview
12.6.2. Subclassing the Dispatcher
12.7. Action Controllers
12.7.1. Introduction
12.7.2. Object Initialization
12.7.3. Pre- and Post-Dispatch Hooks
12.7.4. Accessors
12.7.5. View Integration
12.7.5.1. View Initialization
12.7.5.2. Rendering Views
12.7.6. Utility Methods
12.7.7. Subclassing the Action Controller
12.8. Action Helpers
12.8.1. Introduction
12.8.2. Helper Initialization
12.8.3. The Helper Broker
12.8.4. Built-in Action Helpers
12.8.4.1. ActionStack
12.8.4.2. AutoComplete
12.8.4.2.1. AutoCompletion with Dojo
12.8.4.2.2. AutoCompletion with Scriptaculous
12.8.4.3. ContextSwitch and AjaxContext
12.8.4.3.1. Default Contexts Available
12.8.4.3.2. Creating Custom Contexts
12.8.4.3.3. Setting Contexts Per Action
12.8.4.3.4. Initializing Context Switching
12.8.4.3.5. Additional Functionality
12.8.4.3.6. AjaxContext Functionality
12.8.4.4. FlashMessenger
12.8.4.4.1. Introduction
12.8.4.4.2. Basic Usage Example
12.8.4.5. JSON
12.8.4.6. Redirector
12.8.4.6.1. Introduction
12.8.4.6.2. Basic Usage Examples
12.8.4.7. ViewRenderer
12.8.4.7.1. Introduction
12.8.4.7.2. API
12.8.4.7.3. Basic Usage Examples
12.8.4.7.4. Advanced Usage Examples
12.8.5. Writing Your Own Helpers
12.9. The Response Object
12.9.1. Usage
12.9.2. Manipulating Headers
12.9.3. Named Segments
12.9.4. Testing for Exceptions in the Response Object
12.9.5. Subclassing the Response Object
12.10. Plugins
12.10.1. Introduction
12.10.2. Writing Plugins
12.10.3. Using Plugins
12.10.4. Retrieving and Manipulating Plugins
12.10.5. Plugins Included in the Standard Distribution
12.10.5.1. ActionStack
12.10.5.2. Zend_Controller_Plugin_ErrorHandler
12.10.5.2.1. Using the ErrorHandler as a 404 Handler
12.10.5.2.2. Handling Previously Rendered Output
12.10.5.2.3. Plugin Usage Examples
12.10.5.2.4. Error Controller Example
12.10.5.3. Zend_Controller_Plugin_PutHandler
12.11. Using a Conventional Modular Directory Structure
12.11.1. Introduction
12.11.2. Specifying Module Controller Directories
12.11.3. Routing to Modules
12.11.4. Module or Global Default Controller
12.12. MVC Exceptions
12.12.1. Introduction
12.12.2. Handling Exceptions
12.12.3. MVC Exceptions You May Encounter
12.13. Migrating from Previous Versions
12.13.1. Migrating from 1.7.x to 1.8.0 or newer
12.13.1.1. Standard Route Changes
12.13.2. Migrating from 1.6.x to 1.7.0 or newer
12.13.2.1. Dispatcher Interface Changes
12.13.3. Migrating from 1.5.x to 1.6.0 or Newer
12.13.3.1. Dispatcher Interface Changes
12.13.4. Migrating from 1.0.x to 1.5.0 or Newer
12.13.5. Migrating from 0.9.3 to 1.0.0RC1 or Newer
12.13.6. Migrating from 0.9.2 to 0.9.3 or Newer
12.13.7. Migrating from 0.6.0 to 0.8.0 or Newer
12.13.8. Migrating from 0.2.0 or before to 0.6.0

12.1. Zend_Controller Quick Start

12.1.1. Introdução

Zend_Controller é o coração do sistema MVC do Zend Framework. MVC Model-View-Controller é um padrão (design pattern) que separa a Lógica (Regra de Negócios) da Exibição. Zend_Controller_Front implementa o padrão Front Controller, em que todas as requisições são interceptadas pelo front controller (Controle de Frente) e expede um único Action Controllers (Ação de Controle) baseado na requisição URL.

O sistema Zend_Controller foi construído visando a extensibilidade, cada subclasse de uma classes existentes, escrevem novas classes que implementam várias interfaces e classes abastratas que formam a base da família de classes do controle, ou excrevendo plugins ou ações ajudantes (action helpers) para aumentar ou manipular a funcionalidade do sistema.

12.1.2. Quick Start

Se você precisa de maiores informações, pule para a próxima seção. Se você quer apenas começar a trabalhar rapidamente, continue lendo.

12.1.2.1. Criando o Layout do Sistema de Arquivos

O primeiro passo é criar seu layout do sistema de arquivos. Geralmente o layour segue o seguinte exemplo:

application/
    controllers/
        IndexController.php
    models/
    views/
        scripts/
            index/
                index.phtml
        helpers/
        filters/
html/
    .htaccess
    index.php

12.1.2.2. Configurando o Document Root

Seu Servidor Web, deve apontar para seu document root, nesse caso o diretório html/ como mostrado no layout de sistema de arquivos a cima.

12.1.2.3. Criando Regras de Rewrite

Edite o arquivo html/.htaccess a cima como o seguinte exemplo:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
[Note] Leia mais sobre mod_rewrite

As regras de rewrite a cima permite acesso a qualquer arquivo sob seu documment root do virtual host. Se se você não quer expor os arquivos desse diretórios, você pode ser mais restritivo em suas regras. Vá até página do Apache e leia mais sobre o mod_rewrite

Se você está'usando IIS 7.0, use as seguintes configurações de rewrite:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
     <system.webServer>
         <rewrite>
             <rules>
                 <rule name="Imported Rule 1" stopProcessing="true">
                     <match url="^.*$" />
                     <conditions logicalGrouping="MatchAny">
                         <add input="{REQUEST_FILENAME}"
                             matchType="IsFile" pattern=""
                             ignoreCase="false" />
                         <add input="{REQUEST_FILENAME}"
                             matchType="IsDirectory"
                             pattern="" ignoreCase="false" />
                     </conditions>
                     <action type="None" />
                 </rule>
                 <rule name="Imported Rule 2" stopProcessing="true">
                     <match url="^.*$" />
                     <action type="Rewrite" url="index.php" />
                 </rule>
             </rules>
         </rewrite>
     </system.webServer>
</configuration>

Essas regras a cima vão criar a rota de requisições dos recursos existentes (symlinks, non-empty files ou non-empty directories) consequentes e todas as outras requisiçòes ao front controller.

[Note] Nota

As regras a cima de rewrite são para Apache; para exemplo de regras de rewrite oara oytris Servidores Web, veja a documentaçao de roteamento.

12.1.2.4. Criando o Arquivo Bootstrap

O Arquivo Bootstrap é a página onde todas as solicitaçòes são encaminhadas através do -- html/index.php neste caso. Abra html/index.php no editor de sua preferência e adicione a seguinte linha :

Zend_Controller_Front::run('/path/to/app/controllers');

// Atenção! 
// Só execute esse paço se você souber o que está fazendo!
// Normalmente este parâmtro se encontra dentro de /path/to/app/application/configs
// em um projeto normal.
 

Isso irá criar uma instância e executar o front controller, o qual vai encaminhar suas requisições aos action controllers (controles de açao).

12.1.2.5.  Criando um Controle de Açao Padrão - Action Controller

Antes de falarmos sobre Controles de Acão (Action Controller), você deve primeiramente entender como as requisições são encaminhadas no Zend Framework. Por padrão, é mapeado o primeiro segmento de uma URL chamado de controle (controller) e depois o segundo segmento chamado de ação (action), aqui temos o 'C' (Controll) e o 'V' (View) do MVC.

Por exemplo, temos a URL http://framework.zend.com/roadmap/components, nesse caso o controle (controller) é roadmap e a açao (action) é components. Se nenhuma açao é fornecida, a ação index é executada e se nenhum controle é fornecido também, o controle index é executado (Desde que o Apache esteja com DirectoryIndex automático).

Quando é executado o Zend_Controller pega o valor do controle e mapeia para ele uma classe. Por padrão o nome da classe é o título do controle mais a palavra Controller. Deste modo, o nosos exemplo a cima, o controle roadmap é mapeado para a classe RoadmapController.

Semelhantemente, o valor da ação é mapeado para o método da classe controller. Por padrão, o valor é lower-cased, e a palavra Action é adicionada. Deste modo, em nosso exemplo a cima, a ação components se refere a componentsAction() e o método final é chamado RoadmapController::componentsAction().

Vamos a prática... vamos agora criar um controle e uma ação padrão. O controle e ação padrão são chamados ambos de index. Abra o arquivo application/controllers/IndexController.php, e adicione o seguinte código:

/** Zend_Controller_Action */
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
    }
}

Por padrão, o " ViewRenderer Action Helpers" (Auxiliar de Ação Renderizador de Visualização) está habilitado. Isso significa que é simples definir um método de ação a um correspondente script de visualização (view script), você vai imediatamente ter o conteúdo renderizado. Por padrão Zend_View é usado como uma camada de visualização (View Layer) no MVC.

O ViewRenderer faz algumas mágicas e usa o nome do controle (por exemplo, index) e o nome da ação atual (exemplo, index) para determina qual templete usar.

Por padrão, templates utilizam a extensão .phtml, então isso significa que no exemplo a cima o template index/index.phtml vai ser renderizada. Adicionalmente, o ViewRenderer automaticamente assume que o diretório views/ está no mesmo nível que o diretório controller e que o atual view script vai estar no subdiretório views/scripts/. Deste modo, a template a ser renderizado vai ser encontrado em application/views/scripts/index/index.phtml

12.1.2.6. Criando o View Script

Como mencionado na seção anteror, view scripts são encontrados em application/views/scripts/; o view script para o controller e action padrão é application/views/scripts/index/index.phtml. Crie esse arquivo e digite algo HTML:

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>My first Zend Framework App</title>
</head>
<body>
    <h1>Hello, World!</h1>
</body>
</html>

12.1.2.7. Criando o Error Controller (Controle de Erro)

Por padrão O plugin manipulador de erro (plugin handler error) é registrado. Esse plugin espera que um controller exista para manipular os erros. Por padrão é assumido o ErrorController junto com o método errorAction():

class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
    }
}

Deduzindo, já sabemos o layout do diretório, então esse arquivo vai ficar em application/controllers/ErrorController.php. Você vai precisar também criar um view script em application/views/scripts/error/error.phtml; Segue um exemplo a baixo:

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Error</title>
</head>
<body>
    <h1>An error occurred</h1>
    <p>An error occurred; please try again later.</p>
</body>
</html>

12.1.2.8. Visualizando o Site!

Com seu primeiro controller e view contruído corretamente, você já pode abrir seu navegador e digitar o endereço de seu site. O domínio nesse exemplo é example.com e qualquer uma das seguintes URLs vão executar uma página.

  • http://example.com/

  • http://example.com/index

  • http://example.com/index/index

Você agora já está pronto para começar a criar mais controles e ações. Parabéns!