再谈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 中的str_replace 函数总结
Apr 27 PHP
php下使用以下代码连接并测试
Apr 09 PHP
PHP 防注入函数(格式化数据)
Aug 08 PHP
php实现单链表的实例代码
Mar 22 PHP
关于svn冲突的解决方法
Jun 21 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
Feb 01 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
PHP函数按引用传递参数及函数可选参数用法示例
Jun 04 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
Aug 05 PHP
Laravel 错误提示本地化的实现
Oct 22 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
一个取得文件扩展名的函数
2006/10/09 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
微信自定义分享php代码分析
2016/11/24 PHP
php格式文件打开的四种方法
2018/02/24 PHP
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
python实现保存网页到本地示例
2014/03/16 Python
python映射列表实例分析
2015/01/26 Python
python 图像平移和旋转的实例
2019/01/10 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
python中线程和进程有何区别
2020/06/17 Python
Python turtle库的画笔控制说明
2020/06/28 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
通息工程毕业生自荐信
2013/10/16 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
房租涨价通知
2015/04/23 职场文书
追悼词范文大全
2015/06/23 职场文书
亲情作文之母爱
2019/09/25 职场文书
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis