再谈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 图像处理类1
Jun 15 PHP
php检查日期函数checkdate用法实例
Mar 19 PHP
php日期操作技巧小结
Jun 25 PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
Dec 15 PHP
PHP的自定义模板引擎
Mar 24 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
Yii2选项卡的简单使用
May 26 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
Oct 15 PHP
php模拟post提交请求调用接口示例解析
Aug 07 PHP
PHP执行linux命令6个函数代码实例
Nov 24 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
Mar 04 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面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
php中的登陆login实例代码
2016/06/20 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
2018/12/20 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
Python实现简单状态框架的方法
2015/03/19 Python
使用python实现BLAST
2018/02/12 Python
超简单使用Python换脸实例
2019/03/27 Python
Python 忽略文件名编码的方法
2020/08/01 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
2014年监理工作总结范文
2014/11/17 职场文书
学生检讨书
2015/01/27 职场文书
材料员岗位职责范本
2015/04/11 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
Python+Tkinter制作专属图形化界面
2022/04/01 Python