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
Proyectos Symfony destacados
La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.