2011-09-03 4 views
14

Estoy haciendo un proyecto usando Symfony 2 y necesito tener un método como preDispatch en Zend que se llamará antes de cualquier acción en el Controlador. Soy muy nuevo en Symfony y navego un poco por la red. Descubrí que había un método preExecute en versiones anteriores de Symfony, pero ahora se ha ido. ¿Qué puedo usar para resolver mi problema?Cómo crear algo así como el método Zend preDispatch en Symfony2

Gracias de antemano.

Respuesta

10

El método preExecute() de Symfony 1 hizo esto muy fácil, pero como dijiste, no está disponible en Symfony2. Afortunadamente, en Symfony2 tienes acceso a eventos. El marco distribuye numerosos eventos durante el ciclo de vida de su aplicación. Aquí hay una lista de algunos de los eventos enviados - http://symfony.com/doc/2.0/book/internals.html#events.

También puede usar la barra de herramientas de depuración web para ver qué eventos se envían y las clases (EventListeners) que están escuchando el evento. Ese enlace de arriba también entra en detalles sobre el sistema de eventos completo en caso de que no esté familiarizado con él.

Lamentablemente, no he tenido que imitar la funcionalidad preExecute, por lo que no sé exactamente qué evento necesitaría escuchar, pero estoy seguro que al leer los documentos sabrá exactamente qué necesita. .

Espero que esto ayude.

+0

Gracias mucho por su sugerencia, me ayudó mucho – haynar

18

Como @Arms me sugirió, comencé a explorar el mecanismo del evento de Symfony 2. Así que ahora voy a escribir el código, eso resolvió mi problema (todas las configuraciones que estoy haciendo en YAML, pero puedes hacerlo en XML o PHP también).

Al principio debe describir en la configuración de Symfony qué tipo de evento desea escuchar y qué debe llamar el kernel cuando ocurre el evento. Por esta abierto el fichero de configuración app \ config \ config.yml y agregue el siguiente código:

services: 
    younamespace.yourbundle.listener.preexecute: 
     class: Location\Of\Your\Listener\Class 
     tags: 
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 

Su clase debe implementar el método onKernelController de la siguiente manera:

public function onKernelController(FilterControllerEvent $event) { 
    if(HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) { 
     $controllers = $event->getController(); 
     if(is_array($controllers)) { 
      $controller = $controllers[0]; 

      if(is_object($controller) && method_exists($controller, 'preExecute')) { 
       $controller->preExecute(); 
      } 
     } 
    } 
} 

Después de esto todos Cuando crea un método preExecute en su controlador, se llamará antes de ejecutar cualquier acción, por lo que puede hacer muchas cosas en ese método, como la inicialización de variables, o algunas comprobaciones antes de escribir en DB, etc.

También puede buscar en la configuración de detalles here (este ejemplo es para el evento kernel.request, pero puede ayudar a entender)

Diviértete;)

+1

Tenga en cuenta que el controlador podría ser un cierre, por lo que debe verificar 'is_array()' en el controlador y 'is_object()' en el primer elemento de esa matriz. – igorw

+0

sí :) tienes razón – haynar

+2

+1 ¡Muy buena solución y explicación! –

Cuestiones relacionadas