关于symfony中的eventDispatcher核心实现的认识
eventDispatcher主要用来实现事件的监听和触发, 再有异常或者其他情况时候,及时调用和触发。
在eventDispatcher的使用中,我们都知道需要先在dispatcher上绑定监听器,然后在需要的情况下,触发特定的事件,其实,对于监听器的选择和事件的选择,我们都是可以控制的,甚至可以脱离listeners直接绑定event。
对于该组件的核心,我认为代码核心可以简化为以下部分。
<?php
/**
* Created by PhpStorm.
*/
class EventDispatcher
{
public $listeners;
// 绑定监听器,将事件名称和监听器需要触发的函数绑定
public function addListener($eventName, $listener)
{
$this->listeners[$eventName][] = $listener;
}
// 获取具有特定的事件名称的监听器
public function getListeners($eventName)
{
return $this->listeners[$eventName];
}
// 运行监听器, 这里使用了call_user_func_array函数的简写
public function callListeners($listeners, $eventName, $event)
{
foreach ($listeners as $listener) {
// 运行时候传递多个参数,如何使用由运行函数决定。
$listener($event, $eventName, $this);
}
}
public function dispatch($event, $eventName)
{
$listeners = $this->getListeners($eventName);
$this->callListeners($listeners, $eventName, $event);
}
}
class OrderListener
{
public function onOrderRist(OrderRiskEvent $event) {
$eventName = func_get_arg(1);
var_dump($eventName);
echo $event->orderEventName;
echo 'is orderListener';
}
}
class OrderRiskEvent
{
const NAME = 'order.risk';
public $orderEventName;
public function __construct($orderEventName)
{
$this->orderEventName = $orderEventName;
}
public function txt()
{
var_dump('this');
}
}
$orderEvent = new OrderRiskEvent('name');
$eventDispatcher = new EventDispatcher();
$orderListener = new OrderListener();
// 绑定事件,其实就是将监听器对象和方法通过数组的形式,传递到dispatcher的listener中
$eventDispatcher->addListener(OrderRiskEvent::NAME, [$orderListener, 'onOrderRist']);
// 触发事件,分为两步,获取事件和运行函数
$eventDispatcher->dispatch($orderEvent, OrderRiskEvent::NAME);
在eventDispatcher组件中,实现了更丰富的功能,比如运行默认方法(通过加载配置,在symfony运行的时候已经加载到eventDispatcher中,还有运行invoke方法实现对象的调用,以及增加监听运行的优先级)。