1. Creamos nuestro controlador y la vista - en el action llamamos al listener
2. Creamos nuestra clase - la que será observada
3. Creamos nuestra clase Evento - la que marca a la clase como observada
4. Creamos nuestra clase Listener - implementa los metodos a llamar segun cada evento
5. Registramos el Evento como un servicio - esto lo hacemos en el archivo de configuracion services.yml
el controlador
class PruebaController extends Controller
{
/**
* @Route("/prueba/prueba1", name="prueba1")
*/
public function prueba1Action() {
$prueba=new Prueba();
$pruebaEvent = new PruebaEvent($prueba);
$this->container->get('event_dispatcher')->dispatch('prueba.event.uno',
$pruebaEvent);
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
]);
}
}
nota:
para el ejemplo estoy llamando al action desde una opcion de menú
<ul class="nav navbar-nav">
<li><a href="{{ path('prueba1') }}">prueba1</a></li>
</ul>
la clase
class Prueba {
private $nombre;
public function getNombre(){
return $this->nombre;
}
public function setNombre($nombre){
$this->nombre=$nombre;
}
}
la clase evento
namespace AppBundle\Event;
class PruebaEvent extends Event {
private $prueba;
public function __construct(Prueba $prueba) {
$this->prueba = $prueba;
}
public function getPrueba(){
return $this->prueba;
}
}
el listener:
namespace AppBundle\EventListener;
class PruebaListener {
private $requestStack;
public function __construct(\Symfony\Component\HttpFoundation\RequestStack $requestStack) {
$this->requestStack = $requestStack;
}
public function onModificarUno (\AppBundle\Event\PruebaEvent $pruebaEvent)
{
$request=$this->requestStack->getCurrentRequest();
$session=$request->getSession();
$session->getFlashBag()->add("success","onModificarUno!");
}
}
el registro del servicio:
services:
app.prueba.listener:
class: AppBundle\EventListener\PruebaListener
arguments: ['@request_stack']
tags:
- { name: kernel.event_listener, event: prueba.event.uno, method: onModificarUno }
p.d: si hubiesen mas métodos, se deben agregar mas lineas en tag por cada uno de ellos
- { name: kernel.event_listener, event: prueba.event.dos, method: onModificarDos }
No hay comentarios:
Publicar un comentario