再谈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 正则匹配函数体
Aug 25 PHP
PHP无敌近乎加密方式!
Jul 17 PHP
php设计模式 Prototype (原型模式)代码
Jun 26 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
php正则表达式使用的详细介绍
Apr 27 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
smarty简单应用实例
Nov 03 PHP
php简单备份与还原MySql的方法
May 09 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 PHP
php+webSoket实现聊天室示例代码(附源码)
Feb 17 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
PHP教程 预定义变量
2009/10/23 PHP
解析PHP的session过期设置
2013/06/29 PHP
学习php开源项目的源码指南
2014/12/21 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
2016/03/18 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
微信小程序框架的页面布局代码
2019/08/17 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
python 多个参数不为空校验方法
2019/02/14 Python
python实现实时视频流播放代码实例
2020/01/11 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
python3.7调试的实例方法
2020/07/21 Python
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
搞笑婚礼主持词
2014/03/13 职场文书
乌镇导游词
2015/02/02 职场文书
辞职申请书范本
2019/05/20 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python
nginx容器方式反向代理实战
2022/04/18 Servers