跳到內容

通用事件物件

編輯此頁

EventDispatcher 元件提供的基本 Event 類別刻意設計得非常精簡,以便透過 OOP 繼承建立 API 特定的事件物件。這允許在複雜的應用程式中編寫優雅且可讀性高的程式碼。

GenericEvent 為那些希望在整個應用程式中僅使用一個事件物件的人提供便利。它適用於大多數目的,開箱即用,因為它遵循標準的觀察者模式,其中事件物件封裝了一個事件「主體」,但額外添加了可選的額外參數。

GenericEvent 除了基本類別 Event 之外,還增加了一些方法

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 授權條款授權。
目錄
    版本