再谈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支持页面回退的两种方法[转]
Feb 14 PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 PHP
PHP新手入门学习方法
May 08 PHP
php防止SQL注入详解及防范
Nov 12 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
php时间戳格式化显示友好的时间函数分享
Oct 21 PHP
分享十款最出色的PHP安全开发库中文详细介绍
Mar 22 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
Dec 21 PHP
php面向对象之反射功能与用法分析
Mar 29 PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
PHP 实现 JSON 数据的编码和解码操作详解
Apr 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
PHP写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
一道关于php变量引用的面试题
2010/08/08 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
图文详解WinPE下安装Python
2016/05/17 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
css3中transition属性详解
2014/09/02 HTML / CSS
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
自我鉴定的范文
2013/10/03 职场文书
营业员演讲稿
2013/12/30 职场文书
大学生期末自我鉴定
2014/02/01 职场文书
献爱心倡议书
2014/04/14 职场文书
园艺师求职信
2014/04/27 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
家庭教育培训学习心得体会
2016/01/14 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
25张裸眼3D图片,带你重温童年的记忆,感受3D的魅力
2022/02/06 杂记
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫
讲解MySQL增删改操作
2022/05/06 MySQL