thanks all 最近一直在學symfony2,現在對於EventDispatcher組件理解不了,官方文件不是很明白。 。求解
ringa_lee
對jQuery熟悉?事件機制總是差不多的:
(一)先定義event的名字
這個就好比js的onclick,是一個識別而已,你可以定義個事件名字如:vendor.my_event,為了方便使用,你可以用一個「枚舉」類別來記錄這些event:
final class Events { const MY_EVENT = 'vendor.my_event'; // 其他event…… }
程式碼裡就可以用Events::MY_EVENT來取代直接寫那個字串,建造這個「枚舉」類別不是必須,但推薦這麼做:
(二)定義一個事件類別(上下文定義)
用jQuery我們通常不會自己定義事件類,但其實這個事件類也是存在的(用的預設的),在jQuery的事件回調裡,接受的第一個參數就是事件類的對象,這個對象會攜帶一些上下文的東西,如e.target。
用sf的EventDispatcher,你透過定義自己的事件類,來進行型別檢查,和提供回呼時的上下文(通俗的說,就是可以從事件物件上取到什麼資料)。
// 这个是sf为你提供的一个基础类 use Symfony\Component\EventDispatcher\Event; // 你的事件类 class SomeEvent extends Event { public function __cosntruct() { // 按需定义你的事件类 } }
(三)觸發事件
你有一個事件名了,和一個事件類了,而sf已經給你配好了一個事件分發器,你可以直接使用它來觸發事件:
// 事件上可以携带什么,是通过定义你的事件类来实现的 // 初始化一个事件类,如果你定义了初始化参数,或者事件类上提供了什么方法,就根据需要调用: $event = new SomeEvent('参数?'); $event->someMethod('你自定义的方法'); // 在controller里取事件分发器 $dispatcher = $this->get('event_dispatcher'); // 将$event,以Events::MY_EVENT事件触发 $dispatcher->dispatch(Events::MY_EVENT, $event);
(四)定義一個監聽(回調)
// 引入你事件类的实际命名空间 use YourNS\SomeEvent; class SomeListener { public function onMyEvent(SomeEvent $event) { // 你从事件上拿到了某个值 $var = $event->getSomeVar(); // 然后可以根据这个值做点什么: // ... } }
(五)使回呼監聽對應事件
你可以用程式碼的方式來加入回調:
$listener = new SomeListener(); // 你可以把其他(需要解耦的服务注入到这个listener) $dispatcher = $this->get('event_dispatcher'); $dispatcher->addListener(Events::MY_EVENT, array($listener, 'onMyEvent'));
你也可以用設定的方式,也就是用依賴注入(DIC)來做:
#services.yml vendor.some_listener: class: '回调的类名' #arguments: [ 需要调用的服务 ] tags: - { name: kernel.event_listener, event: vendor.my_event, method: onMyEvent }
對jQuery熟悉?事件機制總是差不多的:
(一)先定義event的名字
這個就好比js的onclick,是一個識別而已,你可以定義個事件名字如:vendor.my_event,為了方便使用,你可以用一個「枚舉」類別來記錄這些event:
程式碼裡就可以用Events::MY_EVENT來取代直接寫那個字串,建造這個「枚舉」類別不是必須,但推薦這麼做:
(二)定義一個事件類別(上下文定義)
用jQuery我們通常不會自己定義事件類,但其實這個事件類也是存在的(用的預設的),在jQuery的事件回調裡,接受的第一個參數就是事件類的對象,這個對象會攜帶一些上下文的東西,如e.target。
用sf的EventDispatcher,你透過定義自己的事件類,來進行型別檢查,和提供回呼時的上下文(通俗的說,就是可以從事件物件上取到什麼資料)。
(三)觸發事件
你有一個事件名了,和一個事件類了,而sf已經給你配好了一個事件分發器,你可以直接使用它來觸發事件:
(四)定義一個監聽(回調)
(五)使回呼監聽對應事件
你可以用程式碼的方式來加入回調:
你也可以用設定的方式,也就是用依賴注入(DIC)來做: