Новое в Symfony 4.4: Простые слушатели событий

Symfony вызывает несколько событий во время запрос-ответ. Слушатели событий и подписчики событий позволяют вам выполнить некоторый код для ответа на эти события.

Подписчики событий обычно предпочтительнее, потому что они могут слушать несколько событий и не требуют никакой конфигурации при использовании автоконфигурации. В Symfony 4.4 улучшили слушателей событий, чтобы упростить их настройку.

Сначала удалите атрибут event тега kernel.event_listener, используемого при регистрации слушателя:

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

Затем убедитесь, что ваш слушатель событий имеет метод, названный как события на которое подписывается (например onKernelRequest()) или __invoke(), чтобы избежать необходимости определять метод прослушивателя событий в теге kernel.event_listener:

namespace App\EventListener;

use Symfony\Component\HttpKernel\Event\RequestEvent;

final class MyRequestListener
{
    public function __invoke(RequestEvent $event): void
    {
        // ...
    }
}

Вот и все. Теперь Symfony будет анализировать аргументы метода слушателя (в этом примере RequestEvent), чтобы узнать, с каким событием связан слушатель событий.

Благодаря этой упрощенной конфигурации вы можете удалить конфигурацию всех ваших слушателей событий и заменить их следующим, что-бы зарегистрировать все событий одновременно:

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

Вызываемые слушатели сущностей Doctrine

Слушатели сущностей Doctrine — один из нескольких способов работы с событиями Doctrine. В Symfony 4.4 также улучшили их, предоставив возможность использовать магический PHP метод __invoke() для определения логики слушателя:

namespace App\EventListener;

use App\Entity\User;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;

class UserChangedNotifier
{
    public function __invoke(User $user, LifecycleEventArgs $event)
    {
        // ...
    }
}

Таким образом, вам не нужно определять собственный атрибут метода в теге doctrine.orm.entity_listener, который используется для регистрации слушателя:

services:
    # ...

    App\EventListener\UserChangedNotifier:
        tags:
            -
                name: 'doctrine.orm.entity_listener'
                entity: 'App\Entity\User'
                # before, when not defining the method name, Symfony looked for
                # a method called after the event (e.g. 'postUpdate()') Now it
                # will also look for an '__invoke()' method
                event: 'postUpdate'