Nuevo en Symfony 4.1: Mejorados los event listeners

En las aplicaciones que utilizan Symfony 4 es recomendable gestionar los eventos mediante subscribers en vez de listeners ya que solamente los subscribers se configuran automáticamente cuando se utiliza la opción de autoconfiguración de servicios.

No obstante, para las aplicaciones que todavía utilizan listeners, en Symfony 4.1 los hemos mejorado para que soporten el método mágico de PHP __invoke(). Si consideras la siguiente configuración de un servicio:

# config/services.yaml
App\EventListener\UserListener:
    tags: [{ name: kernel.event_listener, event: kernel.request }]

Cuando la etiqueta kernel.event_listener no define el atributo method, Symfony ejecuta el método cuyo nombre es on + "el nombre del evento en CamelCase". En este ejemplo, el método a ejecutar sería onKernelRequest(). En Symfony 4.1, si el listener no define ese método, Symfony busca el método __invoke() y lo ejecuta si existe.

Así que en Symfony 4.1, la clase UserListener podría incluir el siguiente código:

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
 
class UserListener
{
    public function __invoke(GetResponseEvent $event)
    {
        // ...
    }
}

Relacionado con este cambio, hemos añadido soporte para __invoke() en otras partes del framework, como por ejemplo TemplateController:

# config/routes.yaml
index:
    path: /
    # antes de Symfony 4.1 tenías que añadir el nombre del método: 'templateAction'
    controller: 'Symfony\Bundle\FrameworkBundle\Controller\TemplateController::templateAction'
    # a partir de Symfony 4.1, TemplateController define un método __invoke()
    controller: 'Symfony\Bundle\FrameworkBundle\Controller\TemplateController'
    defaults:
      template: 'homepage.html.twig'

Esta funcionalidad fue contribuida por Roland Franssen en el pull request #25275.

Fuente: New in Symfony 4.1: Invokable event listeners

Comentarios

Publicada el

22 de febrero de 2018

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.