对Yii框架中事件【event】的理解

什么是事件

怎么去理解事件呢,通俗一点来讲,好比你去淘宝网买东西,下了一个订单,下订单之后会触发和订单相关的一些事情,比如系统会将订单信息推入队列、通知卖家备货,这就是一系列的事情集合。

引用上述下订单的例子,一般按照传统的开发流程,实现上述功能,应该这样写(伪代码):

class OrderController
{
   

    public function actionCreateOrder()
    {
   
        // 1.创建订单
        $orderModel = new Order();
        $orderModel->create($order_id,$buyer_id);
        OrderModel::create();

        // 2.推入队列
        $orderQueue = new OrderQueue();
        $orderQueue->push($queue_name,$order_id);

        // 3.短信通知商家
        $msg = new Msg();
        $msg->send($seller_id,$content);
    }
}

这种写法在功能实现上是没有问题,但是有一个弊端就是,代码耦合在一起,假如现在产品规划,要在下单之后,给买家发送一封邮件,那是不是就要在这段代码里新添加代码逻辑:

public function actionCreateOrder()
{
   
    // 1.创建订单
    $orderModel = new Order();
    $orderModel->create($order_id,$buyer_id);
    OrderModel::create();

    // 2.推入队列
    $orderQueue = new OrderQueue();
    $orderQueue->push($queue_name,$order_id);

    // 3.短信通知商家
    $msg = new Msg();
    $msg->send($seller_id,$content);

    // 4.邮件通知买家
    $mail = new Mail();
    $mail->send($buyer_id,$content);
}

如果后期又要对下订单进行功能扩充和修改,那么就要频繁的去修改这段代码,时间长了,这段代码会越来越长,越来越臃肿,越来越难维护。分析其中原因,就是从功能上说,下单和下单之后的一系列事件,诸如发短信,发邮件,其实是松耦合的关系,但是在actionCreateOrder()方里,把这几个功能捆绑的死死的,丝毫分不开,这就是一种糟糕的设计。所以,这里我们要引入事件,事件在这里就是为了解耦,让代码逻辑变的松散,和易于维护。

动手实现一个我们自己的事件类

先来简单实现一个我们自己的事件类:

class Event
{
   
    protected $_events = [];

    public function on($name, $handler, $append = true)
    {
   
        //这里用$append来干涉同一个事件下的handler执行顺序
        if ($append || empty($this->_events[$name])) {
   
            $this->_events[$name][] = [$handler];
        } else {
   
            //如果$append为false,则会优先执行该事件下的这个handler
            //即将这个handler放入该事件数组的第一位
            array_unshift($this->_events[$name], [$handler]);
        }
    }

    public function trigger($name)
    {
   
        if (!empty($this->_events[$name])) {
   
            foreach ($this->_events[$name] as $handlerBox) {
   
                call_user_func($handlerBox[0]);
            }
        }
    }
}


class TestEvent extends Event
{
   

    public function run()
    {
   
        $this->on("EVENT_1", [
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值