再谈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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
Mar 15 PHP
PHP DataGrid 实现代码
Aug 12 PHP
PHP文件读写操作之文件读取方法详解
Jan 13 PHP
用PHP+MySQL搭建聊天室功能实例代码
Aug 20 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
Jun 01 PHP
深入PHP数据加密详解
Jun 18 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
C# WinForm中实现快捷键自定义设置实例
Jan 23 PHP
详解PHP实现异步调用的4种方法
Mar 14 PHP
PHP进程通信基础之信号
Feb 19 PHP
php装饰者模式简单应用案例分析
Oct 23 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中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
ajax实现无刷新分页(php)
2010/07/18 PHP
PHP使用数组实现队列
2012/02/05 PHP
ThinkPHP多表联合查询的常用方法
2020/03/24 PHP
php动态函数调用方法
2015/05/21 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
jQuery MD5加密实现代码
2010/03/15 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
ECMAScript6--解构
2017/03/30 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
Python实现Linux命令xxd -i功能
2016/03/06 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
如何利用python发送邮件
2020/09/26 Python
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
城市精细化管理实施方案
2014/03/04 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
2014年派出所工作总结
2014/11/21 职场文书