再谈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
header()函数使用说明
Nov 23 PHP
php 结果集的分页实现代码
Mar 10 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
Jun 03 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
变量在 PHP7 内部的实现(一)
Dec 21 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
Dec 15 PHP
Yii2实现UploadedFile上传文件示例
Feb 15 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 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数据库操作面向对象的优点
2006/10/09 PHP
smarty中js的调用方法示例
2014/10/27 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
php多重接口的实现方法
2015/06/20 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
JScript的条件编译
2007/05/29 Javascript
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
javascript时间差插件分享
2016/07/18 Javascript
如何选择适合你的JavaScript框架
2017/11/20 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
pandas通过索引进行排序的示例
2018/11/16 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
伦敦最有品味的百货:Liberty London
2016/11/12 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
淘宝活动策划方案
2014/02/06 职场文书
教师专业自荐信
2014/05/31 职场文书
护理专业自荐书
2014/06/04 职场文书
运动会观后感
2015/06/09 职场文书
乔迁新居祝福语
2019/11/04 职场文书
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers