我不太会组织这些技术含义,只说说我自己的理解,希望能帮到你!
https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpKernel/HttpKernel.php#L128```
$event = new GetResponseEvent($this, $request, $type);
$this->dispatcher->dispatch(KernelEvents::REQUEST, $event);
```
EventDispatcher ,即调度器, dispatch 为动词,是指去调度(触发)某个事件,这个类似于 jQuery 的 trigger 和 angular 中的 $broadcast($emit)。
在这里 KernelEvents::REQUEST 为事件名称,$event 是事件实体对象(当前事件的相关参数,也可以使用 Symfony\Component\EventDispatcher\GenericEvent 方法),说直白一点,就是当发生 KernelEvents::REQUEST 的时候,去做一个件事情,并把 $event 当作参数传递过去,但是你会发现只是定义了事件,并没有说去做的事情是什么!
EventDispatcher 中还有一个方法, EventDispatcher::addListener($eventName, $listener, $priority = 0):
https://github.com/symfony/symfony/blob/master/src/Symfony/Component/EventDispatcher/EventDispatcher.php#L102这个 addListener (监听器)就是用来指定前面所说的:告诉事件调度器,在某个事件发生时去做什么,第二个参数就是事件处理,举个例子:
```
$this->dispatcher->addListener(KernelEvents::REQUEST, function(GetResponseEvent $event) {
$request = $event->getRequest();
var_dump($request->getClientIp());
exit;
});
```
我监听了 KernelEvents::REQUEST 事件,来获取当前请求对象中的 IP 地址,可以看到,在事件处理中的 $event 就是事件发生时,传传递过来的 GetResponseEvent 事件实体!
subscriber 与 listener 相同的,在 EventDispatcher::addSubscriber 内部去掉用了 addListener 方法,看源码:
https://github.com/symfony/symfony/blob/master/src/Symfony/Component/EventDispatcher/EventDispatcher.php#L102subscriber 与 listener 的不同点在于,前者在定义阶段就指定了由谁来负责处理事件,而后者是在事件中去决定需要去捕获哪些事件(也就是 EventSubscriberInterface::getSubscribedEvents 方法),后者更灵活, Symfony 内部代码都是使用的 subscriber !