这真的很简单。Symfony 2 事件系统功能强大,服务标签可以胜任。
- 将调度程序注入到要触发事件的类中。服务 ID 是
event_dispatcher
;
- 在需要时触发事件
$this->dispatcher->dispatch('facebook.post_auth', new FilterFacebookEvent($args))
;
- 创建一个实现的服务
EventSubscriberInterface
,定义一个静态getSubscribedEvents()
方法。当然你想听facebook.post_auth
事件。
所以你的静态方法看起来像:
static public function getSubscribedEvents()
{
return array(
'facebook.post_auth' => 'onPostAuthentication'
);
}
public function onPostAuthentication(FilterFacebookEvent $event)
{
// Do something, get the event args, etc
}
最后将此服务注册为调度程序的订阅者:给它一个标签(例如facebook.event_subscriber
),然后创建一个RegisterFacebookEventsSubscribersPass
(参见本教程)。您的编译器传递应该检索所有标记的服务,并且在循环内应该调用:
$dispatcher = $container->getDefinition('event_dispatcher');
$subscribers = $container->findTaggedServiceIds('facebook.event_subscriber');
foreach($subscribers as $id => $attributes) {
$definition->addMethodCall('addSubscriber', array(new Reference($id)));
}
通过这种方式,您可以快速让订阅者(例如,用于登录)简单地标记您的服务。