El Front Controller y los Plugins en Zend Framework
Por Carlos Nacianceno, @igormx
Zend Framework siempre ha tenido en cuenta la extensibilidad, es decir, la capacidad de añadir comportamiento y funcionalidad a nuestra aplicación, esto gracias a las mismas características de la OOP. Así, Zend Framework ofrece distintos mecanismos para lograrlo, como son los Action Helpers y los Front Controller Plugins.
¿Qué es el Front Controller?
El Front Controller en Zend Framework es el encargado de parsear la información de la petición, mapear la ruta URI y determinar los controladores que deben ser ejecutados, instanciar los mismos y ejecutar las acciones respectivas de cada controlador. Todas estas tareas no son realizadas directamente por el Front Controller sino por sub-componentes especializados.
Cada uno de los eventos que realiza el Front Controller, enrutamiento, ciclo de despacho, el despacho de las acciones individuales, puede ser extendido por plugins a través de “ganchos” o acciones hook relacionadas con uno los eventos:
- routeStartup() : antes del proceso de enrutamiento.
- routeShutdown() : después del enrutamiento.
- distpatchLoopStartup() : antes de iniciar el ciclo de despacho de controladores de acción
- preDistpatch() : antes de ejecutar una acción de controlador.
- postDistpatch(): después de ejecutar una acción de controlador.
- distpatchLoopShutdown() : después de terminar el ciclo de despacho de acciones.
Es aquí donde entran los plugins, pues al implementar uno o más de esos métodos añadimos funcionalidad a nuestra aplicación.
Cómo crear un Plugin
Tienes que crear una clase que extienda a la clase abstracta Zend_Controller_Plugin_Abstract
implementando alguno de los métodos antes mencionados, esto de acuerdo a el tipo de funcionalidad que queramos añadir. Es importante mencionar que todo los métodos de la clase reciben un parámetro del tipo Zend_Controller_Request_Abstract
por lo que hacer un Type Hinting es una buena idea.
Es importante notar que este parámetro del Request, nos trae la posibilidad de acceder a cualquier información de la petición y ejecutar diversas acciones en base a eso. También podemos acceder al objeto Response para establecer contenido o encabezados a la respuesta.
1
2
3
4
5
6
7
8
9
|
class Application_Plugin_Layouts extends Zend_Controller_Plugin_Abstract { public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request ) { $layoutsArray = array ( "layoutNaranja" , "layoutRojo" , "layoutAzul" ); $layoutRandom = $layoutsArray [ array_rand ( $layoutsArray )]; Zend_Layout::getMvcInstance()->setLayout( $layoutRandom ); } } |
En el ejemplo anterior se establece un layout aleatorio, esto, aunque simple, nos evita duplicar código en todos los controladores, ya que este código será ejecutado antes de iniciar el ciclo de despache de los controladores.
Registrar un Plugin
Por último para que nuestro plugin sea ejecutado en cada petición tenemos que registrarlo con nuestro Front Controller pues él es el encargado de hacerlo. Hay 2 formas de registrar un plugin:
Desde el Bootstrap.
1
2
|
$front = Zend_Controller_Front::getInstance(); $front ->registerPlugin( new Application_Plugin_Layouts()); |
Desde el archivo de configuración.
1
|
resources.frontController.plugins.Layouts = "Application_Plugin_Layouts" |
Así como en nuestro plugin de ejemplo, podemos crear más para añadir funcionalidad en ciertos puntos del procesamiento de la petición y realizar tareas como validaciones de identidad y permisos, logeo, redirecciones en base a parámetros, cambios en el ruteo de los controladores, etc.