2012-09-14 82 views
0

有沒有辦法在服務中注入事件以使事件不可知的服務類型?
散文:
該服務說:嘿,給我任何事件,我會instanciate它,並在我完成我的工作後開火。將事件注入服務

我想它很困難,因爲事件的結構可能非常不同:
Event1在構造函數和Event2中只需要一個參數。

其目的是減少捆綁中的依賴關係,同時賦予它自定義記錄器掛鉤到服務的靈活性。

我該如何做到這樣?

也許相反:引發服務事件並使偵聽器事件不可知?

+0

你想只觸發自定義事件還是由Symfony2或其他包提供的事件? –

+0

我想保持它儘可能靈活,所以我猜想任何事件 – ivoba

+0

你想如何檢索事件?服務是否只檢索事件的名稱?你是否已經知道事件的(可能的)論點是如何給你的服務的? –

回答

1

如果服務的調用者知道事件的參數,並且事件的監聽者知道該事件,則可以創建該事件。

我以我在Symfony2烹飪書中的示例爲例:How to extend a Class without using Inheritance

通常你會分派事件是這樣的:

$event = new HandleUndefinedMethodEvent($this, $method, $arguments); 
$this->dispatcher->dispatch('foo.method_is_not_found', $event); 

在你的服務,你可以添加一個方法來創建新的事件:

public function createEvent($name, $class, $arguments) 
{ 
    ... 
    $eventClass = new \ReflectionClass($class); 
    $event = $eventClass->newInstanceArgs($arguments); 
    $this->dispatcher->dispatch($name, $event); 
} 

在這種情況下,服務並不需要知道關於事件,但是,如上所述,調用者和聽衆必須知道。

+0

是的,這是一個好主意,但是這裏的爭論來自服務之外,這並不是很有用。與此同時,我真的懷疑我的方法。 – ivoba

+0

如果你想在控制器中有一些邏輯來控制事件的參數,我會實現多個幫助器服務。根據事件的類型,我會調用此幫助程序服務來計算事件的參數,然後返回您的主要服務以分派事件。 –