再谈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实现的功能是显示8条基色色带
Oct 09 PHP
相对路径转化成绝对路径
Apr 10 PHP
PHP面向对象分析设计的经验原则
Sep 20 PHP
fetchAll()与mysql_fetch_array()的区别详解
Jun 05 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
PHP函数eval()介绍和使用示例
Aug 20 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
PHP仿微信多图片预览上传实例代码
Sep 13 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 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
初识laravel5
2015/03/02 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
Cookie 小记
2010/04/01 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
常用DOM整理
2015/06/16 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
[02:08]2018年度CS GO枪械皮肤设计大赛优秀作者-完美盛典
2018/12/16 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
对python读写文件去重、RE、set的使用详解
2018/12/11 Python
Python argparse模块应用实例解析
2019/11/15 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
Python requests上传文件实现步骤
2020/09/15 Python
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
演讲比赛策划方案
2014/06/11 职场文书
关于旅游的活动方案
2014/08/15 职场文书
教师三严三实心得体会
2014/10/11 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
财务统计员岗位职责
2015/04/14 职场文书
接待员岗位职责范本
2015/04/15 职场文书
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers