我有一個類用於從各種相互關聯的包中生成導航。我有一個導航服務來完成這個。Symfony2正確地處理來自服務的事件
爲了連接這個服務和導航的其他位,我想讓其他bundle定義他們自己的服務,然後監聽事件監聽器並在適當的時候添加他們的導航項。
問題是,我無法弄清楚如何讓一個服務監聽一個事件,而無需手動調用該服務來創建它。
任何想法?
爲了給出一個更加具體的想法,我有這樣的事情:
// Set up as a service in the bundle.
class Navigation {
// ...
protected $dispatcher; // event dispatcher passed in to service
// ...
public function generateNavigation() {
$items = array();
// add some items
$event = new NavigationEvent($items); // custom event
$this->eventDispatcher->dispatchEvent('navigation_event', $event);
}
}
// Set up as a service in some secondary bundle.
class NavigationWorker {
/**
* @param $dispatcher Same instance as Navigation
*/
public function __construct(EventDispatcher $dispatcher) {
$dispatcher->addListener('navigation_event', array($this, 'doSomething'));
}
}
有了這個設置,它應該工作,如果NavigationWorker被稱爲在某些時候和構造的,但我可以並不總是直接調用它們,所以它永遠不會被構造,而且偵聽器也不會被添加。
我目前的做法是將所有NavigationWorkers傳遞給Navigation並讓它添加它們的監聽器,但這非常醜陋。
太棒了,看起來像它會做的伎倆。謝謝。 – samanime