Объект Generic Event (событие общего назначения)

Дата обновления перевода 2024-06-28

Объект Generic Event (событие общего назначения)

Базовый класс Event, предоставленный компонентом EventDispatcher слишком скуден для создания объектов событий, относящихся к API, путём наследования используя OOP. Это позволяет сохранять элегантный и читаемый код в сложных приложениях.

GenericEvent доступен для удобства тех, кто хочет использовать только один объект события во всём приложении. Он подходит для большинства целей сразу после установки, потому что следует стандартной схеме обозрения, где объект события инкапсулирует "субъект" события, а также имеет дополнение в виде необзательных аргументов.

GenericEvent имеет простой API в дополнение к базовому классу Event

  • __construct(): Конструктор берёт субъект события и любые аргументы;
  • getSubject(): Получить субъект;
  • setArgument(): Устанавливает аргумент по ключу;
  • setArguments(): Устанавливает массив аргументов;
  • getArgument(): Получает аргумент по ключу;
  • getArguments(): Геттер для всех аргументов;
  • hasArgument(): Возвращает "true" если ключ аргумента существует;

GenericEvent также реализует ArrayAccess в аргументах события, что очень удобно для передачи дополнительных аргументов, касающихся субъекта события.

Следующие примеры отображают примеры использования, чтобы дать вам общее представление о гибкости. Примеры предполагают, что в диспетчер были добавлены слушатели событий.

Просто передача субъект:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Symfony\Component\EventDispatcher\GenericEvent;

$event = new GenericEvent($subject);
$dispatcher->dispatch($event, 'foo');

class FooListener
{
    public function handler(GenericEvent $event): void
    {
        if ($event->getSubject() instanceof Foo) {
            // ...
        }
    }
}

Передача и обработка аргументов, используя ArrayAccess API для доступа к аргументам события:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Symfony\Component\EventDispatcher\GenericEvent;

$event = new GenericEvent(
    $subject,
    ['type' => 'foo', 'counter' => 0]
);
$dispatcher->dispatch($event, 'foo');

class FooListener
{
    public function handler(GenericEvent $event): void
    {
        if (isset($event['type']) && 'foo' === $event['type']) {
            // ... сделать что-то
        }

        $event['counter']++;
    }
}

Фильтрация данных:

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\EventDispatcher\GenericEvent;

$event = new GenericEvent($subject, ['data' => 'Foo']);
$dispatcher->dispatch($event, 'foo');

class FooListener
{
    public function filter(GenericEvent $event): void
    {
        $event['data'] = strtolower($event['data']);
    }
}