通用事件对象

3.4 版本
维护中的版本

EventDispatcher组件提供的Event基类,被有意设计得简约,为的是能够通过OOP的继承来创建“特定API”的事件对象。有让复杂的程序变得优雅可读的考量。

GenericEvent类,可以为那些希望在整个程序中“只使用一个事件对象”的人们提供方便。对于很多场景而言它都是极为好用的,因为它遵循的是标准的observer pattern(观察者模式),该模式下的事件对象对event 'subject'进行封装,同时还附加了额外的可选参数。

GenericEvent除了Event基类之外还有如下的简单API:

GenericEvent还对事件参数实现了ArrayAccess接口,这为向event subject传递附加参数提供了巨大便利。

以下例程展示的使用场景可以作为(通用事件对象的)灵活性的基本参考。

直接传入一个subject:

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('foo', $event);
 
class FooListener
{
    public function handler(GenericEvent $event)
    {
        if ($event->getSubject() instanceof Foo) {
            // ...
        }
    }
}

传入并处理参数时,使用ArrayAccess接口,即可访问到事件的参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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') {
            // ... do something 进行一些操作
        }
 
        $event['counter']++;
    }
}

过滤数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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']);
    }
}

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)