感谢你来到这里
我真的很激动
盼望,能有你的支持
捐赠可扫描二维码转账支付
支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
ContainerAwareEventDispatcher
是一个特殊的EventDispatcher
实现,它耦合了DependencyInjection组件中的服务容器。它可以把服务指定为监听,令EventDispatcher
极其强大。
设置很简单,注入ContainerInterface
到ContainerAwareEventDispatcher
中:
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 创作共用授权。