【问题标题】:Symfony2 custom event dispatcher and listenerSymfony2 自定义事件调度器和监听器
【发布时间】:2014-07-16 08:39:05
【问题描述】:

我正在尝试创建自定义事件,但无法使其工作。

我做了什么:

1.我在

中创建了事件识别类
namespace Path\ToBundle;  
final class CookieEvents
{
    const COOKIE_EVENT = 'cookie.event';
}

2.创建事件

namespace Path\ToBundle\EventListener;
use Path\ToBundle\Event\FilterResponseEvent;
class ResponseListener
{
    public function onCookieInit(FilterResponseEvent $event)
    {
        //some complex logic goes here
        echo('test');
    }
} 

3.创建的事件监听器

namespace Path\ToBundle\Event;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpFoundation\Response;
class FilterResponseEvent extends Event
{
    protected $response;
    public function __construct(Response $response)
    {
        $this->response = $response;
    }
    public function getResponse()
    {
        return $this->response;
    }
}

4.尝试在service.yml中注册事件监听

kernel.listener.cookie.event:
    class: Path\ToBundle\Event\ResponseListener
    tags:
        - { name: kernel.event_listener, event: cookie.event, method: onCookieInit }

5.接下来我尝试在控制器动作中调度事件

//includes before class
use Symfony\Component\EventDispatcher\EventDispatcher;
use Path\ToBundle\Event\FilterResponseEvent;

//inside controller action
//... $response variable is created

$dispatcher = new EventDispatcher();
$event = new FilterResponseEvent($response);
$dispatcher->dispatch(CookieEvents::COOKIE_EVENT, $event);

return $response;
//EOF controller action

我想要实现的是能够在某些操作上触发事件。不幸的是,这不起作用。 事件概念对我来说是新的,我仍然对我在这里所做的事情没有信心,但这就是我能够从这些例子中弄清楚的。也许有人可以告诉我我是否要朝着正确的方向纠正我?如果没有,请提供一些指导。

【问题讨论】:

  • 对于调度程序,您应该使用$dispatcher = $this->get('event_dispatcher'),因为您将使用不同的实例。
  • 这是一个很好的例子来说明如何设置自定义事件

标签: symfony events


【解决方案1】:

感谢@Qoop 指出调度程序的正确用法:

$dispatcher = $this->get('event_dispatcher')

还有命名空间错误:

class: Path\ToBundle\Event\ResponseListener  //incorrect

class: Path\ToBundle\EventListener\ResponseListener  //correct

【讨论】: