有沒有辦法在服務中注入事件以使事件不可知的服務類型?
散文:
該服務說:嘿,給我任何事件,我會instanciate它,並在我完成我的工作後開火。將事件注入服務
我想它很困難,因爲事件的結構可能非常不同:
Event1在構造函數和Event2中只需要一個參數。
其目的是減少捆綁中的依賴關係,同時賦予它自定義記錄器掛鉤到服務的靈活性。
我該如何做到這樣?
也許相反:引發服務事件並使偵聽器事件不可知?
有沒有辦法在服務中注入事件以使事件不可知的服務類型?
散文:
該服務說:嘿,給我任何事件,我會instanciate它,並在我完成我的工作後開火。將事件注入服務
我想它很困難,因爲事件的結構可能非常不同:
Event1在構造函數和Event2中只需要一個參數。
其目的是減少捆綁中的依賴關係,同時賦予它自定義記錄器掛鉤到服務的靈活性。
我該如何做到這樣?
也許相反:引發服務事件並使偵聽器事件不可知?
如果服務的調用者知道事件的參數,並且事件的監聽者知道該事件,則可以創建該事件。
我以我在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);
}
在這種情況下,服務並不需要知道關於事件,但是,如上所述,調用者和聽衆必須知道。
是的,這是一個好主意,但是這裏的爭論來自服務之外,這並不是很有用。與此同時,我真的懷疑我的方法。 – ivoba
如果你想在控制器中有一些邏輯來控制事件的參數,我會實現多個幫助器服務。根據事件的類型,我會調用此幫助程序服務來計算事件的參數,然後返回您的主要服務以分派事件。 –
你想只觸發自定義事件還是由Symfony2或其他包提供的事件? –
我想保持它儘可能靈活,所以我猜想任何事件 – ivoba
你想如何檢索事件?服務是否只檢索事件的名稱?你是否已經知道事件的(可能的)論點是如何給你的服務的? –