再谈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
一个用于mysql的数据库抽象层函数库
Oct 09 PHP
PHP控制网页过期时间的代码
Sep 28 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
php实现字符串首字母大写和单词首字母大写的方法
Mar 14 PHP
PHPStrom中实用的功能和快捷键大全
Sep 23 PHP
php多线程并发实现方法
Sep 30 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
PHP简单实现循环链表功能示例
Nov 10 PHP
php中的explode()函数实例介绍
Jan 18 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中MVC的开发经验分享
2012/05/17 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
Javascript的比较汇总
2016/07/25 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
Python实现二叉堆
2016/02/03 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
幼儿园教学管理制度
2014/02/04 职场文书
电焊工工作岗位职责
2014/02/06 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
人代会简报
2015/07/21 职场文书
详解Redis复制原理
2021/06/04 Redis
SpringBoot Http远程调用的方法
2022/08/14 Java/Android