Обʼєкт Загальної (generic) події

Дата оновлення перекладу 2022-11-12

Обʼєкт Загальної (generic) події

Базовий клас 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)
    {
        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)
    {
        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)
    {
        $event['data'] = strtolower($event['data']);
    }
}