El Despachador Introducción Despachar es el proceso de tomar el objeto solicitud, Zend_Controller_Request_Abstract , extraer el nombre del módulo, el nombre del controlador, el nombre de la acción, y los parámetros opcionales contenido en él, y luego instanciar un controlador y llamar una acción de ese controlador. Si no se encuentra algún módulo, controlador o acción, se usarán los valores por defecto para ellos. Zend_Controller_Dispatcher_Standard especifica index para cada uno de los controladores y acciones por defecto y default para el valor por defecto del módulo, pero permite al desarrollador cambiar los valores por defecto para cada uno usando los métodos setDefaultController() , setDefaultAction() , y setDefaultModule() respectivamente. Módulo por Defecto Cuando se crean aplicaciones modulares, puede encontrarse queriendo también el namespace por defecto del módulo (la configuración por defecto es que el módulo por defecto es no namespaced). Como de 1.5.0, ahora puede hacerlo especificando el prefixDefaultModule como TRUE tanto en el front controller como es su despachador: setParam('prefixDefaultModule', true); // En su despachador: $dispatcher->setParam('prefixDefaultModule', true); ]]> Esto le permite re-determinar un módulo existente para ser el módulo por defecto para una solicitud. El proceso de despachar tiene lugar en un bucle en el front controller. Antes de llevarse a cabo el despacho, el front controller rutea la solicitud para encontrar valores especificados por el usuario para el módulo, controlador, acción, y los parámetros opcionales. A continuación entra en un loop de despacho, despachando la solicitud. Al comienzo de cada iteración, establece un flag en el objeto solicitud indicando que la acción se ha despachado. Si una acción o un plugin pre o postDispatch resetea ese flag, el loop de despacho continuará e intentará despachar la nueva solicitud. Cambiando el controlador y/o la acción en la solicitud y reseteando el flag despachado, el desarrollador puede definir una cadena de peticiones a realizar. El método del controlador de acción que controla ese despacho es _forward() ; llamar a este método para cualquiera de los pre/postDispatch() o métodos de acción, proporcionando un controlador de acciónes, módulo y, opcionalmente cualquier parámetro adicional que desee enviar a la nueva acción: _forward('bar', null, null, array('baz' => 'bogus')); } public function barAction() { // adelantar a una acción en otro controlador: // FooController::bazAction(), // en el módulo actual: $this->_forward('baz', 'foo', null, array('baz' => 'bogus')); } public function bazAction() { // adelantar a una acción en otro controlador en otro módulo, // Foo_BarController::bazAction(): $this->_forward('baz', 'bar', 'foo', array('baz' => 'bogus')); } ]]> Subclaseando el Despachador Zend_Controller_Front llamará en primer lugar al router para determinar la primera acción en la solicitud. A continuación se entra en un loop de despacho, el cual llama al despachador para despachar la acción. El despachador necesita de una variedad de datos a fin de hacer su trabajo - necesita saber cómo formatear los nombres del controlador y de la acción, dónde mirar para los archivos de clase del controlador, cuándo el nombre de un controlador provisto es válido o no, y una API para determinar si una determinada solicitud es incluso despachable basado en la otra información disponible. Zend_Controller_Dispatcher_Interface define los siguientes métodos como necesarios para cualquier implementación de un despachador: En muchos casos, sin embargo, simplemente debe extender la clase abstracta Zend_Controller_Dispatcher_Abstract , en el que cada uno de estas ya han sido definidas, o Zend_Controller_Dispatcher_Standard para modificar la funcionalidad del despachador estándar. Las posibles razones para subclasear al despachador incluye un deseo de utilizar un esquema diferente para nombrar las clases o métodos en sus controladores de acción, o el deseo de utilizar otro paradigma de despacho como ser despachar los archivos de acción bajo directorios de controladores (en lugar de despacharlos a los métodos de clase).