再谈Yii Framework框架中的事件event原理与应用


Posted in PHP onApril 07, 2020

本文实例讲述了Yii Framework框架中的事件event原理与应用。分享给大家供大家参考,具体如下:

再谈Yii Framework中的事件event,我写过的关于Yii事件event的另一篇文章

Yii Framework 中事件和行为的区别和应用 https://3water.com/article/184208.htm

假设有类MyComponent,它是继承于CComponent,通过查看 CComponent 的 __set() 方法,

public function __set($name,$value)
{
  $setter='set'.$name;
  if(method_exists($this,$setter))
    return $this->$setter($value);
  else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
  {
    // duplicating getEventHandlers() here for performance
    $name=strtolower($name);
    if(!isset($this->_e[$name]))
      $this->_e[$name]=new CList;
    return $this->_e[$name]->add($value);
  }
  else if(is_array($this->_m))
  {
    foreach($this->_m as $object)
    {
      if($object->getEnabled() && (property_exists($object,$name) || $object->canSetProperty($name)))
        return $object->$name=$value;
    }
  }
  if(method_exists($this,'get'.$name))
    throw new CException(Yii::t('yii','Property "{class}.{property}" is read only.',
      array('{class}'=>get_class($this), '{property}'=>$name)));
  else
    throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
      array('{class}'=>get_class($this), '{property}'=>$name)));
}

第四行可知,我们可以通过 onXXX 来直接设置事件的。

绑定到全局事件处理

方法一:

直接在main.php里面定义

/***************************************************
在我们想要的内容的前后出现了这些代码
只是为了说明,我们添加的内容是要放在
这个配置数据的一维里面。
'import'=>array(
  'application.models.*',
  'application.components.*',
  'application.helpers.*',
),
'defaultController'=>'post',
***************************************************/

//其它代码
'import'=>array(
  'application.models.*',
  'application.components.*',
  'application.helpers.*',
),

/************** 这才是我们想要添加的代码 **************/
'onBeginRequest' => array('MyEventHandler', 'MyEventHandlerMethod'),

'defaultController'=>'post',
//其它代码

方法二:

//参考自framework/logging/CLogRouter.php的init()方法
Yii::app()->attachEventHandler('onEndRequest',array($this,'processLogs'));

绑定到局部事件处理

随时随地无论在controller还是model里面,只要是CComponent的子类,都可以这样定义,

$myComponent->onClick = $callback;

这里的 $callback 指向了一个有效的 PHP 回调。它可以是一个全局函数也可以是类中的一个方法。

如果是后者,它必须以一个数组的方式提供 : array($object,'methodName')

其它文章推荐:

Yii组件的事件机制分析 https://3water.com/article/184203.htm

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
在线竞拍系统的PHP实现框架(一)
Oct 09 PHP
实用函数10
Nov 08 PHP
PHP通过header实现文本文件下载的代码
Aug 08 PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
使用配置类定义Codeigniter全局变量
Jun 12 PHP
PHP生成plist数据的方法
Jun 16 PHP
PHP批量生成图片缩略图的方法
Jun 18 PHP
php实现图片缩略图的方法
Mar 29 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
php中final关键字用法分析
Dec 07 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
Mar 29 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
Yii框架组件的事件机制原理与用法分析
Apr 07 #PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
Apr 07 #PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
Apr 07 #PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
Apr 07 #PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 #PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
Apr 06 #PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 #PHP
You might like
php实现jQuery扩展函数
2009/10/30 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
php实现encode64编码类实例
2015/03/24 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
js微信分享实现代码
2020/10/11 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
vue+elementUI实现简单日历功能
2020/09/24 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
Django Form and ModelForm的区别与使用
2019/12/06 Python
Pytorch 多维数组运算过程的索引处理方式
2019/12/27 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
《口技》教学反思
2014/02/21 职场文书
单位证明范文
2015/06/18 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python