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'