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语句,呵呵,一个可以运行得非常 ...
随机推荐
- ZOJ 3604 Tunnel Network(凯莱定理)
题目链接: E - Tunnel Network ZOJ - 3604 题目大意: 给定编号1-n的点,和给定编号1-S 的联通图,刚开始1号联通图只有 1个顶点,就是编号为1的顶点,2号联通图也只有 ...
- kalilinux渗透测试笔记
声明:本文理论大部分是苑房弘kalilinux渗透测试的内容 第五章:基本工具 克隆网页,把gitbook的书记下载到本地 httrack "http://www.mybatis.org/m ...
- 【easy】278. First Bad Version
有一系列产品,从某个开始其后都不合格,给定一个判断是否合格的函数,找出N个产品中第一个不合格的产品. 正确答案: // Forward declaration of isBadVersion API. ...
- m3u8下载转码一次完成
最近看到有部分网站开始加入视频解析服务,虽然这种服务会损害土豆优酷等视频托管商的权益,但是,烦人的广告也让我们开始寻找有没有什么比较靠谱的解决方法~实际上很多网站都在使用m3u8文件格式,里面都是视频 ...
- 发送邮件工具类MailHelper
using System; using System.Net; using System.Net.Mail; using System.Text; using System.Threading; na ...
- 利用Owin解决CORS报错问题
我的项目是vue + ASP.NET .在 Vue调试时,由于vue开启的调试用的服务器端口号 和 后台.NET程序的端口号是不同的,发送Ajax请求时,就会报错.这里就不提报错的原因了,网上有很多, ...
- Google 以 Flutter 作为原生突破口,移动端即将统一了
Android 的前生今世 Android 系统 Android系统作为全球第一大系统,基于 Java 开发的移动端有着诸多的性能优势. 2018年前 H5 的性能瓶颈和 RN 的停更 导致业界对跨平 ...
- vue 统一处理token失效问题
使用http response 拦截器 在main.js中添加 import axios from 'axios'; axios.interceptors.response.use(response ...
- Lesson 2-3(字符串)
2.5 字符串 --- 字符串是不可变的. >>> str = "Hello world!" >>> str[-6:-1] = "py ...
- http强转https websocket
需要在httpd.conf文件最后添加即可: <Directory /> Options FollowSymLinks AllowOverride All RewriteEngine on ...