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_Frontorquesta todo el flujo de trabajo del sistemaZend_Controller. Es una interpretación del patrón FrontController.Zend_Controller_Frontprocesa 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 porZend_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_Interfacese 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 porZend_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 enZend_Controller_Request_Httpy 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 URLhttp://localhost/foo/bar/key/valuese 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_Rewritetambién se puede usar para hacer coincidir rutas arbitrarias; consulte la documentación del enrutador para más información. -
Zend_Controller_Dispatcher_Interfacese 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]](images/note.png)
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-bato/foo.bar/baz.bat. Zend_Controller_Actiones el componente base de controlador de acción. Cada controlador es una única clase que extiende la claseZend_Controller_Actiony debe contener uno o más métodos de acción.-
Zend_Controller_Response_Abstractdefine 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.