symfony中的eventDispatcher核心简单实现

关于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方法实现对象的调用,以及增加监听运行的优先级)。

参考文档:https://symfony.com/doc/current/event_dispatcher.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值