yii2 注册一个新事件(trigger Event)

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


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

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

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

第三步:注册该事件

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

1、Order.php

class Order extends \yii\db\ActiveRecord
{

    /**
     * 生成单号事件
     */
    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 yii\base\Event;

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

posted @ 2019-03-25 18:50  Chrdai  阅读(2561)  评论(0编辑  收藏  举报