Nuevo en Symfony 4.4: Event Listeners más sencillos

Durante el flujo petición-respuesta Symfony notifica varios eventos. Los event listeners y event subscribers pueden escuchar esos eventos para ejecutar cierto código como respuesta.

Los event subscribers son más cómodos de usar porque permiten escuchar a varios eventos y no requieren de ninguna configuración cuando se usa la autoconfiguración de servicios. En Symfony 4.4 hemos mejorado los event listeners para que también sean muy fáciles de configurar.

En primer lugar, puedes eliminar el atributo event en la etiqueta kernel.event_listener del servicio asociado al listener:

# config/services.yaml
services:
    App\EventListener\MyRequestListener:
        tags:
            # Antes
            - { name: kernel.event_listener, event: kernel.request }
            # Después
            - { name: kernel.event_listener }

Además, haz que tu listener use un método con el nombre estándar (onKernelRequest() en este caso) o un método __invoke(). De esta forma no tendrás que configurar el nombre del método en la etiqueta kernel.event_listener:

namespace App\EventListener;
 
use Symfony\Component\HttpKernel\Event\RequestEvent;
 
final class MyRequestListener
{
    public function __invoke(RequestEvent $event): void
    {
        // ...
    }
}

Eso es todo. A partir de Symfony 4.4, Symfony introspecciona los argumentos del método del listener para saber qué evento quieres escuchar. En este caso, el argumento de tipo RequestEvent le dice a Symfony que quieres escuchar el evento kernel.request, por lo que no hay necesidad de configurarlo a mano.

Generalizando este ejemplo, puedes eliminar toda la configuración de todos los servicios de los event listeners y reemplazarla por lo siguiente, que registra todos los event listeners de una vez:

# config/services.yaml
services:
    App\EventListener\:
        resource: ../src/EventListener/*
        tags: [kernel.event_listener]

Esta funcionalidad fue contribuida por Alexander M. Turek en el pull request #33851.

Entity Listeners de Doctrine invocables

Los entity listeners de Doctrine son una de las formas habituales de trabajar con los eventos de Doctrine. En Symfony 4.4 también los hemos mejorado para que puedas usar el método mágico __invoke() para definir la lógica del listener:

namespace App\EventListener;
 
use App\Entity\User;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
 
class UserChangedNotifier
{
    public function __invoke(User $user, LifecycleEventArgs $event)
    {
        // ...
    }
}

De esta forma no tienes que definir el atributo method en la etiqueta doctrine.orm.entity_listener que se usa para registrar el listener:

services:
    # ...

    App\EventListener\UserChangedNotifier:
        tags:
            -
                name: 'doctrine.orm.entity_listener'
                entity: 'App\Entity\User'
                # antes, cuando no se definía un método, Symfony buscaba métodos
                # llamados como el evento (ej. 'postUpdate()'). Ahora también
                # busca si existe el método '__invoke()'
                event: 'postUpdate'

Esta funcionalidad fue contribuida por Thomas Calvet en el pull request #32486.


Fuente: New in Symfony 4.4: Simpler Event Listeners

Comentarios

Publicada el

29 de octubre de 2019

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.