Container Aware的事件派遣器

3.4 版本
维护中的版本

介绍 

ContainerAwareEventDispatcher 是一个特殊的EventDispatcher实现,它耦合了DependencyInjection组件中的服务容器。它可以把服务指定为监听,令EventDispatcher极其强大。

设置 

设置很简单,注入ContainerInterfaceContainerAwareEventDispatcher中:

1
2
3
4
5
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;
 
$container = new ContainerBuilder();
$dispatcher = new ContainerAwareEventDispatcher($container);

添加监听 

ContainerAwareEventDispatcher既可以直接加载特定服务,也可以加载实现了EventSubscriberInterface接口的服务。

下面的例子中,假定服务容器连同相关的服务都已经被载入。

容器中的服务必须被标为public。

添加服务 

为了访问已有的服务定义,使用addListenerService()方法,其参数中的$callback是一个array($serviceId, $methodName)数组:

1
$dispatcher->addListenerService($eventName, array('foo', 'logListener'));

添加订阅器服务 

事件订阅器可以通过addSubscriberService()方法添加进来,该方法第一个参数是订阅器的service id,而第二个参数是服务的类名(这个类必须实现EventSubscriberInterface接口),如下面例程:

1
2
3
4
$dispatcher->addSubscriberService(
    'kernel.store_subscriber',
    'StoreSubscriber'
);

EventSubscriberInterface正是你所预期的那个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
// ...
 
class StoreSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::RESPONSE => array(
                array('onKernelResponsePre', 10),
                array('onKernelResponsePost', 0),
            ),
            'store.order'     => array('onStoreOrder', 0),
        );
    }
 
    public function onKernelResponsePre(FilterResponseEvent $event)
    {
        // ...
    }
 
    public function onKernelResponsePost(FilterResponseEvent $event)
    {
        // ...
    }
 
    public function onStoreOrder(FilterOrderEvent $event)
    {
        // ...
    }
}

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

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