2014-07-16 95 views
8

我试图创建自定义事件,但无法使其工作。Symfony2自定义事件调度程序和侦听器

我做了什么:

1.I创建的事件识别类

namespace Path\ToBundle; 
final class CookieEvents 
{ 
    const COOKIE_EVENT = 'cookie.event'; 
} 

2.Created事件

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

3.created事件侦听器

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.Next我尝试调度控制器的动作里面事件

//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 

我试图做到的,是要在某些行动能够火灾事件。不幸的是,这是行不通的。 事件概念对我来说是新事物,我对我在这里做的事情仍然没有信心,但它是我能够从例子中得出的结果。也许有人可以告诉我,如果我要朝正确的方向改正我?如果不是的话,一些指导更值得赞赏。

+3

对于调度员您应该使用'$调度= $这个 - > get('event_dispatcher')',因为您将使用不同的实例。 – qooplmao

+2

这是如何设置自定义事件的绝佳示例 – lopsided

回答

4

感谢,@Qoop您指出调度的正确用法:

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

此外,有命名错误:

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

class: Path\ToBundle\EventListener\ResponseListener //correct 
相关问题