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