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
yii2 注册一个新事件(trigger Event)的更多相关文章
- Mantis去掉登录界面的“注册一个新账号”链接
Mantis1.1.2主界面提供了新账号注册功能,但是只能注册默认权限的帐号.不是很实用,那就干脆去掉吧. (1) 打开Mantis目录下的login_page.php和lost_pwd_page.p ...
- Javascript 自定义事件 (custom event)
Javascript 中经常会用到自定义事件.如何创建一个简单的自定义事件呢?在创建自定义的事件之前,我们应该考虑一下和事件有关的东西.例如 click 事件,首先我们要能注册一个click事件(在一 ...
- JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数
本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...
- CREATE TYPE - 定义一个新的数据类型
SYNOPSIS CREATE TYPE name AS ( attribute_name data_type [, ... ] ) CREATE TYPE name ( INPUT = input_ ...
- Yii2的深入学习--事件Event
我们先来看下事件在 Yii2 中的使用,如下内容摘自 Yii2中文文档 事件可以将自定义代码“注入”到现有代码中的特定执行点.附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行.例如, ...
- Yii2基本概念之——事件(Event)
说起事件(event),我们可是一点都不陌生.现实生活当中的事件无处不在,比如你发了一条微博,触发了一条事件,导致关注你的人收到了一条消息,看到你发的内容:比如你通过支付宝买东西,付了款,触发一个事件 ...
- CREATE TRIGGER - 定义一个新的触发器
SYNOPSIS CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- 有意思的RTL函数RegisterClass(在持久化中,你生成的一个新类的对象,系统并不知道他是如何来的,因此需要你注册)good
例子1:Delphi中使用纯正的面向对象方法(这个例子最直接) Delphi的VCL技术使很多程序员能够非常快速的入门:程序员门只要简单的拖动再加上少量的几个Pascal语句,呵呵,一个可以运行得非常 ...
随机推荐
- 使用antd Table + mobx 处理数组 出现的一系列问题
在store中定义了一个数组: @observable list = [...] 若是在table组件中直接使用list: <Table className={styles.table} col ...
- iTOP-4418开发板所用核心板研发7寸/10.1寸安卓触控一体机
iTOP-4418开发板所用核心板研发7寸/10.1寸安卓触控一体机 作为重中之重的电源管理选型,经多方对比测试最终选用AXP228,并得到原厂肯定 预留锂电池接口,内置充放电电路及电量计,可轻松搞定 ...
- 浅入深出Vue系列
浅入深出Vue导航 导航帖,直接点击标题即可. 文中所有涉及到的资源链接均在最下方列举出来了. 前言 基础篇 浅入深出Vue:工具准备之WebStorm搭建及配置 浅入深出Vue之工具准备(二):Po ...
- Map的几种取值方法
public static void main(String[] args) throws IOException,ParseException { Map<String,String> ...
- ubuntu命令安装
1.当make时,发现没有对应的命令: apt-get install build-essential 安装工具,可解决这个问题
- Jquery验证码倒计时
html代码: <input type="button" value="获取验证码" id="getCode" style=" ...
- php cookie的问题
- MySQL ERROR 1054(42S22)
修改用户的密码,网上搜到的命令为如下 执行后报错 ERROR 1054(42S22) Unknown column 'password' in ‘field list’ 错误的原因是 5.7版本下的m ...
- vue 图片地址错误处理
<img src="/logo.png" :onerror="defaultImg"> data() { return { defaultImg: ...
- java 静态代理模式
package proxy.staticproxy; public interface IStar { public void sing(); } package proxy.staticproxy; ...