有些时候我们需要在某个方法的中间注册一个新事件,确保某些业务的可拓展性。
下面我介绍一下注册一个新事件的方法:
第一步:需要的地方(比如控制器或模型)中定义一个事件常量(如: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