TigerZF
🌐Español

24.2. Fundamentos de Zend_Controller

El sistema Zend_Controller está diseñado para ser ligero, modular y extensible. Es un diseño minimalista que permite flexibilidad y cierta libertad a los usuarios, a la vez que proporciona suficiente estructura para que los sistemas construidos alrededor de Zend_Controller compartan algunas convenciones comunes y una disposición de código similar.

El siguiente diagrama muestra el flujo de trabajo, y la narrativa que sigue describe en detalle las interacciones:

El flujo de trabajo de Zend_Controller se implementa mediante varios componentes. Aunque no es necesario comprender completamente los entresijos de todos estos componentes para usar el sistema, tener un conocimiento práctico del proceso resulta útil.

  • Zend_Controller_Front orquesta todo el flujo de trabajo del sistema Zend_Controller. Es una interpretación del patrón FrontController. Zend_Controller_Front procesa todas las peticiones recibidas por el servidor y es, en última instancia, responsable de delegar las peticiones a los ActionControllers (Zend_Controller_Action).

  • Zend_Controller_Request_Abstract (a menudo denominado el objeto de petición) representa el entorno de la petición y proporciona métodos para establecer y recuperar los nombres del controlador y la acción, así como cualquier parámetro de la petición. Además, lleva un registro de si la acción que contiene ha sido despachada o no por Zend_Controller_Dispatcher. Las extensiones al objeto de petición abstracto se pueden usar para encapsular todo el entorno de la petición, permitiendo que los enrutadores extraigan información del entorno de la petición con el fin de establecer los nombres del controlador y la acción.

    Por defecto, se utiliza Zend_Controller_Request_Http, que proporciona acceso a todo el entorno de la petición HTTP.

  • Zend_Controller_Router_Interface se utiliza para definir enrutadores. El enrutamiento es el proceso de examinar el entorno de la petición para determinar qué controlador, y qué acción de ese controlador, debe recibir la petición. Este controlador, acción, y parámetros opcionales se establecen entonces en el objeto de petición para ser procesados por Zend_Controller_Dispatcher_Standard. El enrutamiento ocurre solo una vez: cuando se recibe la petición inicialmente y antes de que se despache el primer controlador.

    El enrutador por defecto, Zend_Controller_Router_Rewrite, toma un punto final de URI tal como se especifica en Zend_Controller_Request_Http y lo descompone en un controlador, una acción y parámetros basándose en la información de ruta de la URL. Por ejemplo, la URL http://localhost/foo/bar/key/value se decodificaría para usar el controlador foo, la acción bar, y especificar un parámetro key con un valor de value.

    Zend_Controller_Router_Rewrite también se puede usar para hacer coincidir rutas arbitrarias; consulte la documentación del enrutador para más información.

  • Zend_Controller_Dispatcher_Interface se utiliza para definir despachadores. El despacho es el proceso de extraer el controlador y la acción del objeto de petición y asignarlos a un archivo de controlador (o clase) y un método de acción en la clase del controlador. Si el controlador o la acción no existen, se encarga de determinar los controladores y acciones por defecto a despachar.

    El proceso de despacho en sí consiste en instanciar la clase del controlador y llamar al método de acción en esa clase. A diferencia del enrutamiento, que ocurre solo una vez, el despacho ocurre en un bucle. Si el estado de despachado del objeto de petición se restablece en algún momento, el bucle se repetirá, llamando a cualquier acción que esté actualmente establecida en el objeto de petición. La primera vez que el bucle finaliza con el estado de despachado del objeto de petición establecido (booleano TRUE), se dará por terminado el procesamiento.

    El despachador por defecto es Zend_Controller_Dispatcher_Standard. Define los controladores como MixedCasedClasses terminadas en la palabra Controller, y los métodos de acción como camelCasedMethods terminados en la palabra Action: FooController::barAction(). En este caso, el controlador se denominaría foo y la acción bar.

    [Note] Convenciones de nomenclatura en el uso de mayúsculas

    Dado que los seres humanos son notoriamente inconsistentes a la hora de mantener la sensibilidad a mayúsculas y minúsculas al escribir enlaces, Zend Framework en realidad normaliza la información de ruta a minúsculas. Esto, por supuesto, afectará a cómo nombre sus controladores y acciones... o los referencie en los enlaces.

    Si desea que el nombre de la clase de su controlador o el método de acción tenga varias MixedCasedWords o camelCasedWords, deberá separar esas palabras en la url con un '-' o un '.' (aunque puede configurar el carácter utilizado).

    Por ejemplo, si fuera a acceder a la acción en FooBarController::bazBatAction(), la referenciaría en la url como /foo-bar/baz-bat o /foo.bar/baz.bat.

  • Zend_Controller_Action es el componente base de controlador de acción. Cada controlador es una única clase que extiende la clase Zend_Controller_Action y debe contener uno o más métodos de acción.

  • Zend_Controller_Response_Abstract define una clase de respuesta base utilizada para recopilar y devolver respuestas de los controladores de acción. Recopila tanto cabeceras como contenido del cuerpo.

    La clase de respuesta por defecto es Zend_Controller_Response_Http, que es adecuada para su uso en un entorno HTTP.

El flujo de trabajo de Zend_Controller es relativamente sencillo. Una petición es recibida por Zend_Controller_Front, que a su vez llama a Zend_Controller_Router_Rewrite para determinar qué controlador (y qué acción de ese controlador) despachar. Zend_Controller_Router_Rewrite descompone la URI con el fin de establecer los nombres del controlador y la acción en la petición. Zend_Controller_Front entra entonces en un bucle de despacho. Llama a Zend_Controller_Dispatcher_Standard, pasándole la petición, para despachar al controlador y la acción especificados en la petición (o usar los valores por defecto). Una vez que el controlador ha terminado, el control vuelve a Zend_Controller_Front. Si el controlador ha indicado que se debe despachar otro controlador restableciendo el estado de despachado de la petición, el bucle continúa y se realiza otro despacho. En caso contrario, el proceso termina.