Rumah > Soal Jawab > teks badan
terima kasih semua Saya telah mempelajari symfony2 baru-baru ini, dan sekarang saya tidak dapat memahami komponen EventDispatcher, dan dokumentasi rasmi tidak begitu jelas. . Selesaikan
黄舟2017-05-16 16:46:48
Familiar dengan jQuery? Mekanisme acara sentiasa sama:
(1) Mula-mula tentukan nama acara
Ini seperti onclick js, ia hanyalah satu pengiktirafan Anda boleh menentukan nama acara seperti: vendor.my_event Untuk kemudahan penggunaan, anda boleh menggunakan kelas "enumeration" untuk merekodkan acara ini:
final class Events
{
const MY_EVENT = 'vendor.my_event';
// 其他event……
}
Anda boleh menggunakan Events::MY_EVENT dalam kod dan bukannya menulis rentetan secara langsung Ia tidak perlu membina kelas "penghitungan" ini, tetapi ia disyorkan:
(2) Tentukan kelas acara (definisi konteks)
Menggunakan jQuery, kami secara amnya tidak mentakrifkan kelas acara sendiri, tetapi sebenarnya kelas acara ini juga wujud (yang lalai digunakan Dalam panggilan balik acara jQuery, parameter pertama yang diterima ialah objek kelas acara, dan objek ini). akan membawa Beberapa perkara kontekstual seperti e.sasaran.
Menggunakan sf's EventDispatcher, anda mentakrifkan kelas acara anda sendiri untuk melakukan semakan jenis dan menyediakan konteks untuk panggilan balik (dalam istilah orang biasa, apakah data yang boleh diperoleh daripada objek acara).
// 这个是sf为你提供的一个基础类
use Symfony\Component\EventDispatcher\Event;
// 你的事件类
class SomeEvent extends Event
{
public function __cosntruct()
{
// 按需定义你的事件类
}
}
(3) Peristiwa pencetus
Anda mempunyai nama acara dan kelas acara, dan sf telah melengkapkan anda dengan penghantar acara Anda boleh menggunakannya terus untuk mencetuskan acara:
// 事件上可以携带什么,是通过定义你的事件类来实现的
// 初始化一个事件类,如果你定义了初始化参数,或者事件类上提供了什么方法,就根据需要调用:
$event = new SomeEvent('参数?');
$event->someMethod('你自定义的方法');
// 在controller里取事件分发器
$dispatcher = $this->get('event_dispatcher');
// 将$event,以Events::MY_EVENT事件触发
$dispatcher->dispatch(Events::MY_EVENT, $event);
(4) Takrifkan pendengar (panggilan balik)
// 引入你事件类的实际命名空间
use YourNS\SomeEvent;
class SomeListener
{
public function onMyEvent(SomeEvent $event)
{
// 你从事件上拿到了某个值
$var = $event->getSomeVar();
// 然后可以根据这个值做点什么:
// ...
}
}
(5) Buat panggilan balik mendengar acara yang sepadan
Anda boleh menambah panggilan balik menggunakan kod:
$listener = new SomeListener(); // 你可以把其他(需要解耦的服务注入到这个listener)
$dispatcher = $this->get('event_dispatcher');
$dispatcher->addListener(Events::MY_EVENT, array($listener, 'onMyEvent'));
Anda juga boleh menggunakan konfigurasi, iaitu suntikan kebergantungan (DIC):
#services.yml
vendor.some_listener:
class: '回调的类名'
#arguments: [ 需要调用的服务 ]
tags:
- { name: kernel.event_listener, event: vendor.my_event, method: onMyEvent }