TigerZF
🌐Español

Capítulo 24. Zend_Controller

Tabla de contenidos

24.1. Inicio rápido de Zend_Controller
24.1.1. Introducción
24.1.2. Inicio rápido
24.1.2.1. Crear la estructura del sistema de archivos
24.1.2.2. Establecer la raíz del documento
24.1.2.3. Crear las reglas de reescritura
24.1.2.4. Crear el archivo de arranque
24.1.2.5. Crear el controlador de acción predeterminado
24.1.2.6. Crear el script de vista
24.1.2.7. Crear el controlador de errores
24.1.2.8. ¡Ver el sitio!
24.2. Fundamentos de Zend_Controller
24.3. El controlador frontal
24.3.1. Resumen
24.3.2. Métodos principales
24.3.2.1. getInstance()
24.3.2.2. setControllerDirectory() y addControllerDirectory
24.3.2.3. addModuleDirectory() y getModuleDirectory()
24.3.2.4. dispatch()
24.3.2.5. run()
24.3.3. Métodos de acceso al entorno
24.3.4. Parámetros del controlador frontal
24.3.5. Extender el controlador frontal
24.4. El objeto Request
24.4.1. Introducción
24.4.2. Peticiones HTTP
24.4.2.1. Acceso a los datos de la petición
24.4.2.2. Url base y subdirectorios
24.4.2.3. Determinar el método de la petición
24.4.2.4. Detectar peticiones AJAX
24.4.3. Subclasificar el objeto Request
24.5. El enrutador estándar
24.5.1. Introducción
24.5.2. Uso de un enrutador
24.5.3. Funcionamiento básico del enrutador de reescritura
24.5.4. Rutas predeterminadas
24.5.5. URL base y subdirectorios
24.5.6. Parámetros globales
24.5.7. Tipos de ruta
24.5.7.1. Zend_Controller_Router_Route
24.5.7.1.1. Valores predeterminados de variables
24.5.7.1.2. Requisitos de variables
24.5.7.1.3. Segmentos traducidos
24.5.7.2. Zend_Controller_Router_Route_Static
24.5.7.3. Zend_Controller_Router_Route_Regex
24.5.7.4. Zend_Controller_Router_Route_Hostname
24.5.7.5. Zend_Controller_Router_Route_Chain
24.5.7.5.1. Rutas encadenadas mediante Zend_Config
24.5.7.6. Zend_Rest_Route
24.5.7.6.1. Uso de Zend_Rest_Route
24.5.7.6.2. Zend_Rest_Route con Zend_Config_Ini
24.5.7.6.3. Zend_Rest_Controller
24.5.8. Uso de Zend_Config con el RewriteRouter
24.5.9. Subclasificar el enrutador
24.6. El despachador (Dispatcher)
24.6.1. Resumen
24.6.2. Subclasificar el despachador
24.7. Controladores de acción
24.7.1. Introducción
24.7.2. Inicialización del objeto
24.7.3. Ganchos pre y post despacho
24.7.4. Accesores
24.7.5. Integración con la vista
24.7.5.1. Inicialización de la vista
24.7.5.2. Renderizado de vistas
24.7.6. Métodos de utilidad
24.7.7. Subclasificar el controlador de acción
24.8. Ayudantes de acción
24.8.1. Introducción
24.8.2. Inicialización de ayudantes
24.8.3. El agente de ayudantes (Helper Broker)
24.8.4. Ayudantes de acción incorporados
24.8.4.1. ActionStack
24.8.4.2. AutoComplete
24.8.4.2.1. Autocompletado con Dojo
24.8.4.2.2. Autocompletado con Scriptaculous
24.8.4.3. ContextSwitch y AjaxContext
24.8.4.3.1. Contextos predeterminados disponibles
24.8.4.3.2. Creación de contextos personalizados
24.8.4.3.3. Establecer contextos por acción
24.8.4.3.4. Inicialización del cambio de contexto
24.8.4.3.5. Funcionalidad adicional
24.8.4.3.6. Funcionalidad de AjaxContext
24.8.4.4. FlashMessenger
24.8.4.4.1. Introducción
24.8.4.4.2. Métodos disponibles
24.8.4.4.3. Ejemplo de uso básico
24.8.4.5. JSON
24.8.4.5.1. Uso
24.8.4.5.2. Ejemplo
24.8.4.6. Redirector
24.8.4.6.1. Introducción
24.8.4.6.2. Ejemplos de uso básico
24.8.4.7. ViewRenderer
24.8.4.7.1. Introducción
24.8.4.7.2. API
24.8.4.7.3. Ejemplos de uso básico
24.8.4.7.4. Ejemplos de uso avanzado
24.8.5. Escribir sus propios ayudantes
24.9. El objeto Response
24.9.1. Uso
24.9.2. Manipulación de cabeceras
24.9.2.1. Establecer cabeceras de cookies
24.9.2.1.1. Argumentos del constructor
24.9.3. Segmentos con nombre
24.9.4. Comprobación de excepciones en el objeto Response
24.9.5. Subclasificar el objeto Response
24.10. Plugins
24.10.1. Introducción
24.10.2. Escribir plugins
24.10.3. Uso de plugins
24.10.4. Recuperación y manipulación de plugins
24.10.5. Plugins incluidos en la distribución estándar
24.10.5.1. ActionStack
24.10.5.2. Zend_Controller_Plugin_ErrorHandler
24.10.5.2.1. Uso de ErrorHandler como manejador de 404
24.10.5.2.2. Manejo de salida previamente renderizada
24.10.5.2.3. Ejemplos de uso del plugin
24.10.5.2.4. Ejemplo de controlador de errores
24.10.5.3. Zend_Controller_Plugin_PutHandler
24.11. Uso de una estructura de directorios modular convencional
24.11.1. Introducción
24.11.2. Especificación de directorios de controladores de módulo
24.11.3. Enrutamiento a módulos
24.11.4. Controlador predeterminado de módulo o global
24.12. Excepciones de MVC
24.12.1. Introducción
24.12.2. Manejo de excepciones
24.12.3. Excepciones de MVC que puede encontrar

24.1. Inicio rápido de Zend_Controller

24.1.1. Introducción

Zend_Controller es el corazón del sistema MVC de Zend Framework. MVC significa Modelo-Vista-Controlador y es un patrón de diseño orientado a separar la lógica de la aplicación de la lógica de presentación. Zend_Controller_Front implementa un patrón de controlador frontal (Front Controller), en el que todas las peticiones son interceptadas por el controlador frontal y despachadas a controladores de acción individuales según la URL solicitada.

El sistema Zend_Controller se construyó teniendo en cuenta la extensibilidad, ya sea mediante la subclasificación de las clases existentes, escribiendo nuevas clases que implementen las diversas interfaces y clases abstractas que forman la base de la familia de clases del controlador, o escribiendo plugins o ayudantes de acción para ampliar o manipular la funcionalidad del sistema.

24.1.2. Inicio rápido

Si necesita información más detallada, consulte las siguientes secciones. Si solo quiere ponerse en marcha rápidamente, continúe leyendo.

24.1.2.1. Crear la estructura del sistema de archivos

El primer paso es crear la estructura de su sistema de archivos. La estructura típica es la siguiente:

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

24.1.2.2. Establecer la raíz del documento

En su servidor web, apunte la raíz del documento al directorio html/ de la estructura de sistema de archivos anterior.

24.1.2.3. Crear las reglas de reescritura

Edite el archivo html/.htaccess anterior para que quede de la siguiente manera:

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] Aprenda sobre mod_rewrite

Las reglas de reescritura anteriores permiten el acceso a cualquier archivo bajo la raíz del documento de su host virtual. Si hay archivos que no desea exponer de esta manera, quizá quiera ser más restrictivo en sus reglas. Vaya al sitio web de Apache para obtener más información sobre mod_rewrite.

Si utiliza IIS 7.0, use lo siguiente como su configuración de reescritura:

<?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>

Las reglas anteriores enrutarán las peticiones a los recursos existentes (enlaces simbólicos existentes, archivos no vacíos o directorios no vacíos) en consecuencia, y todas las demás peticiones al controlador frontal.

[Note] Nota

Las reglas de reescritura anteriores son para Apache; para ejemplos de reglas de reescritura para otros servidores web, consulte la documentación del enrutador.

24.1.2.4. Crear el archivo de arranque

El archivo de arranque es la página a través de la cual se enrutan todas las peticiones -- html/index.php en este caso. Abra html/index.php en el editor de su elección y añada lo siguiente:

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

Esto instanciará y despachará el controlador frontal, que enrutará las peticiones a los controladores de acción.

24.1.2.5. Crear el controlador de acción predeterminado

Antes de hablar de los controladores de acción, primero debe comprender cómo se enrutan las peticiones en Zend Framework. Por defecto, el primer segmento de una ruta de URL se corresponde con un controlador, y el segundo con una acción. Por ejemplo, dada la URL http://framework.zend.com/roadmap/components, la ruta es /roadmap/components, que se corresponderá con el controlador roadmap y la acción components. Si no se proporciona ninguna acción, se asume la acción index, y si no se proporciona ningún controlador, se asume el controlador index (siguiendo la convención de Apache que asigna un DirectoryIndex automáticamente).

A continuación, el despachador de Zend_Controller toma el valor del controlador y lo asigna a una clase. Por defecto, convierte a mayúscula inicial (Title-case) el nombre del controlador y añade la palabra Controller. Así, en nuestro ejemplo anterior, el controlador roadmap se asigna a la clase RoadmapController.

De manera similar, el valor de la acción se asigna a un método de la clase controladora. Por defecto, el valor se convierte a minúsculas, y se añade la palabra Action. Así, en nuestro ejemplo anterior, la acción components se convierte en componentsAction(), y el método final llamado es RoadmapController::componentsAction().

Así pues, continuando, vamos a crear ahora un controlador de acción y un método de acción predeterminados. Como se señaló anteriormente, el controlador y la acción predeterminados que se llaman son ambos index. Abra el archivo application/controllers/IndexController.php, e introduzca lo siguiente:

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

Por defecto, el ayudante de acción ViewRenderer está habilitado. Esto significa que, con solo definir un método de acción y un script de vista correspondiente, obtendrá inmediatamente contenido renderizado. Por defecto, Zend_View se utiliza como la capa de vista en el MVC. El ViewRenderer realiza cierta magia, y utiliza el nombre del controlador (por ejemplo, index) y el nombre de la acción actual (por ejemplo, index) para determinar qué plantilla obtener. Por defecto, las plantillas terminan con la extensión .phtml, por lo que esto significa que, en el ejemplo anterior, se renderizará la plantilla index/index.phtml. Además, el ViewRenderer asume automáticamente que el directorio views/, al mismo nivel que el directorio de controladores, será el directorio base de la vista, y que los scripts de vista reales estarán en el subdirectorio views/scripts/. Así, la plantilla renderizada se encontrará en application/views/scripts/index/index.phtml.

24.1.2.6. Crear el script de vista

Como se mencionó en la sección anterior, los scripts de vista se encuentran en application/views/scripts/; el script de vista para el controlador y acción predeterminados está en application/views/scripts/index/index.phtml. Cree este archivo, y escriba algo de 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>

24.1.2.7. Crear el controlador de errores

Por defecto, el plugin del manejador de errores está registrado. Este plugin espera que exista un controlador para manejar errores. Por defecto, se asume un ErrorController en el módulo predeterminado con un método errorAction():

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

Suponiendo la estructura de directorios ya comentada, este archivo irá en application/controllers/ErrorController.php. También necesitará crear un script de vista en application/views/scripts/error/error.phtml; un ejemplo de contenido podría ser el siguiente:

<!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>

24.1.2.8. ¡Ver el sitio!

Con su primer controlador y vista bajo el brazo, ahora puede abrir su navegador y visitar el sitio. Suponiendo que example.com es su dominio, cualquiera de las siguientes URLs le llevará a la página que acabamos de crear:

  • http://example.com/

  • http://example.com/index

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

Ya está listo para empezar a crear más controladores y métodos de acción. ¡Enhorabuena!