Объект Generic Event (событие общего назначения)¶
Базовый класс Event
, предоставленный
компонентом EventDispatcher слишком скуден для создания объектов событий, относящихся
к API, путём наследования используя OOP. Это позволяет сохранять элегантный и читаемый
код в сложных приложениях.
GenericEvent
доступен для удобства
тех, кто хочет использовать только один объект события во всём приложении. Он
подходит для большинства целей сразу после установки, потому что следует стандартной
схеме обозрения, где объект события инкапсулирует “субъект” события, а также
имеет дополнение в виде необзательных аргументов.
GenericEvent
имеет простой API в
дополнение к базовому классу Event
__construct()
: Конструктор берёт субъект события и любые аргументы;getSubject()
: Получить субъект;setArgument()
: Устанавливает аргумент по ключу;setArguments()
: Устанавливает массив аргументов;getArgument()
: Получает аргумент по ключу;getArguments()
: Геттер для всех аргументов;hasArgument()
: Возвращает “true” если ключ аргумента существует;
GenericEvent
также реализует ArrayAccess
в аргументах события,
что очень удобно для передачи дополнительных аргументов, касающихся субъекта
события.
Следующие примеры отображают примеры использования, чтобы дать вам общее представление о гибкости. Примеры предполагают, что в диспетчер были добавлены слушатели событий.
Просто передача субъект:
use Symfony\Component\EventDispatcher\GenericEvent;
$event = new GenericEvent($subject);
$dispatcher->dispatch('foo', $event);
class FooListener
{
public function handler(GenericEvent $event)
{
if ($event->getSubject() instanceof Foo) {
// ...
}
}
}
Передача и обработка аргументов, используя ArrayAccess
API для
доступа к аргументам события:
use Symfony\Component\EventDispatcher\GenericEvent;
$event = new GenericEvent(
$subject,
array('type' => 'foo', 'counter' => 0)
);
$dispatcher->dispatch('foo', $event);
var_dump($event['counter']);
class FooListener
{
public function handler(GenericEvent $event)
{
if (isset($event['type']) && $event['type'] === 'foo') {
// ... сделать что-то
}
$event['counter']++;
}
}
Фильтрация данных:
use Symfony\Component\EventDispatcher\GenericEvent;
$event = new GenericEvent($subject, array('data' => 'Foo'));
$dispatcher->dispatch('foo', $event);
var_dump($event['data']);
class FooListener
{
public function filter(GenericEvent $event)
{
$event['data'] = strtolower($event['data']);
}
}
Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.