В Symfony нет специального класса или компонента под названием «Symfony Observer». Однако Symfony предоставляет систему событий, которая позволяет вам реализовать шаблон наблюдателя с использованием прослушивателей событий и подписчиков. Система событий позволяет вам разделить различные части вашего приложения, предоставляя механизм отправки событий и уведомления зарегистрированных прослушивателей или подписчиков.
Чтобы продемонстрировать реализацию шаблона наблюдателя с использованием системы событий Symfony, давайте создадим пример:
-
Создать класс событий:
// 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; } } -
Создайте прослушиватель событий:
// 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 } } -
Зарегистрируйте прослушиватель событий:
-
Отправить событие:
// 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.