84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
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)來做: