zoukankan      html  css  js  c++  java
  • yii2 注册一个新事件(trigger Event)

    有些时候我们需要在某个方法的中间注册一个新事件,确保某些业务的可拓展性。


    下面我介绍一下注册一个新事件的方法:

    第一步:需要的地方(比如控制器或模型)中定义一个事件常量(如:const EVENT_CREATE_ORDER)。

    第二步:创建一个Event类继承 yii/base/Event.

    第三步:注册该事件

    示例:我需要在订单编号中增加一个事件,方便按照客户的需求修改订单编号的前缀。

    1、Order.php

    class Order extends yiidbActiveRecord
    {
    
        /**
         * 生成单号事件
         */
        const EVENT_CREATE_ORDER = 'EVENT_CREATE_ORDER';
        /**
         * @var string 订单编号前缀
         */
        public static $orderNumPrefix = 'OD';
      
         /**
         * @purpose: 生成订单编号
         * @modif by chrdai
         * @modify time 2019-03-25
         */
        public function createOrderNum(){
            $e = new CreateOrderEvent([
                'params' => ['orderNumPrefix' => self::$orderNumPrefix],
            ]);
            // 某些客户有修单号的需求
            $this->trigger(static::EVENT_CREATE_ORDER,$e);
            $prefix = ArrayHelper::getValue($e->params,'orderIdPrefix');
    
            $count = Yii::$app->redis->incr("count:order_num");
            //取余数是为了防止自增的号码过大导致某些肯能出现的问题
            return sprintf($prefix . '-%s-%04d', date('ymd'), intval($count) % 9999);
        }
    }

    2、CreateOrderEvent.php

    use yiiaseEvent;
    
    class CreateOrderEvent extends Event
    {
        /**
         * @var array 需要修改的参数
         */
        public $params = [];
    
        /**
         * @var bool
         */
        public $skip = false;
    }

    3、使用方法:

    /*
     * ++------修改某个属性 start------++
     * ++ | class | 类名
     * ++ | event | 事件
     * ++ | [$key => $value] | 需要修改的属性
     */
    $arrProperties = [
        [
            'class' => Order::className(),
            'event' => Order::EVENT_CREATE_ORDER,
            'orderNumPrefix' => 'ON', //将工单号的前缀由OD改为ON
        ],
    ];
    foreach ($arrProperties as $val){
        Event::on(current($val),next($val),function(CreateOrderEvent $e) use($val) {
            end($val);
            $e->params[key($val)] = end($val);
        });
        reset($val);
    }

    此为chrdai工作中的总结,如有转载请注明出处:https://www.cnblogs.com/chrdai/p/10595584.html

  • 相关阅读:
    编译i386 Linux 内核并基于 QEMU 运行
    在 Linux 上编译运行并测试 LwIP 协议栈性能
    gdb 重定位源文件目录
    SkyWalking 分布式追踪系统
    微服务化的基石——持续集成(二)
    微服务容器化的分工与合作,促进DevOps (一)
    预订餐位
    单词记录1.26
    What do you do on weekends
    make a travel plan(LC)
  • 原文地址:https://www.cnblogs.com/chrdai/p/10595584.html
Copyright © 2011-2022 走看看