再谈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 相关文章推荐
给多个地址发邮件的类
Oct 09 PHP
生成sessionid和随机密码的例子
Oct 09 PHP
简单示例AJAX结合PHP代码实现登录效果代码
Jul 25 PHP
纯真IP数据库的应用 IP地址转化成十进制
Jun 14 PHP
php file_exists 检查文件或目录是否存在的函数
May 10 PHP
PHP自定session保存路径及删除、注销与写入的方法
Nov 18 PHP
迁移PHP版本到PHP7
Feb 06 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
浅谈Laravel队列实现原理解决问题记录
Aug 19 PHP
php-fpm添加service服务的例子
Apr 27 PHP
Laravel框架下的Contracts契约详解
Mar 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
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
微信access_token的获取开发示例
2015/04/16 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
javascript 避免闭包引发的问题
2009/03/17 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
2017/11/17 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
财产分割协议书范本
2014/11/03 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
用Python实现Newton插值法
2021/04/17 Python
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
SQL Server中搜索特定的对象
2022/05/25 SQL Server