Реализация шаблона наблюдателя в Symfony с использованием прослушивателей событий

В Symfony нет специального класса или компонента под названием «Symfony Observer». Однако Symfony предоставляет систему событий, которая позволяет вам реализовать шаблон наблюдателя с использованием прослушивателей событий и подписчиков. Система событий позволяет вам разделить различные части вашего приложения, предоставляя механизм отправки событий и уведомления зарегистрированных прослушивателей или подписчиков.

Чтобы продемонстрировать реализацию шаблона наблюдателя с использованием системы событий Symfony, давайте создадим пример:

  1. Создать класс событий:

    // src/Event/MyEvent.php
    namespace App\Event;
    use Symfony\Contracts\EventDispatcher\Event;
    class MyEvent extends Event
    {
    private $data;
    public function __construct($data)
    {
        $this->data = $data;
    }
    public function getData()
    {
        return $this->data;
    }
    }
  2. Создайте прослушиватель событий:

    // src/EventListener/MyEventListener.php
    namespace App\EventListener;
    use App\Event\MyEvent;
    class MyEventListener
    {
    public function onMyEvent(MyEvent $event)
    {
        $data = $event->getData();
        // Perform some actions based on the event data
        // Example: Log the event data
        $this->logData($data);
    }
    private function logData($data)
    {
        // Code to log the data
    }
    }
  3. Зарегистрируйте прослушиватель событий:

  4. Отправить событие:

    // src/Controller/MyController.php
    namespace App\Controller;
    use App\Event\MyEvent;
    use Symfony\Component\EventDispatcher\EventDispatcherInterface;
    use Symfony\Component\HttpFoundation\Response;
    class MyController
    {
    private $eventDispatcher;
    public function __construct(EventDispatcherInterface $eventDispatcher)
    {
        $this->eventDispatcher = $eventDispatcher;
    }
    public function myAction()
    {
        // Some code...
        // Dispatch the event
        $event = new MyEvent($data);
        $this->eventDispatcher->dispatch($event);
        // Some code...
    
        return new Response('Event dispatched!');
    }
    }

В этом примере мы создали собственный класс событий MyEvent. Класс MyEventListenerсодержит метод прослушивателя событий onMyEvent, который будет вызываться при отправке события MyEvent. Прослушиватель событий выполняет некоторые действия на основе данных о событии, например, записывает их в журнал. Мы зарегистрировали прослушиватель событий как сервис в контейнере Symfony и пометили его тегом kernel.event_listener, указав событие и вызываемый метод. В класс MyControllerмы внедрили EventDispatcherInterfaceи отправили событие MyEvent.