通用事件物件
EventDispatcher 元件提供的基本 Event 類別刻意設計得非常精簡,以便透過 OOP 繼承建立 API 特定的事件物件。這允許在複雜的應用程式中編寫優雅且可讀性高的程式碼。
GenericEvent 為那些希望在整個應用程式中僅使用一個事件物件的人提供便利。它適用於大多數目的,開箱即用,因為它遵循標準的觀察者模式,其中事件物件封裝了一個事件「主體」,但額外添加了可選的額外參數。
GenericEvent 除了基本類別 Event 之外,還增加了一些方法
- __construct():建構子接受事件主體和任何參數;
- getSubject():取得主體;
- setArgument():依鍵值設定一個參數;
- setArguments():設定參數陣列;
- getArgument():依鍵值取得一個參數;
- getArguments():取得所有參數的 Getter;
- 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']) {
// ... do something
}
$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']);
}
}
本作品,包括程式碼範例,依據 Creative Commons BY-SA 3.0 授權條款授權。