2014-07-16 96 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 
相關問題