symfony 3 eventos

se necesita

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

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable