当前位置:首页 > CMS教程 > 其它CMS > 列表

再谈Yii Framework框架中的事件event原理与应用

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-26 08:37:51 浏览: 评论:0 

本文实例讲述了Yii Framework框架中的事件event原理与应用,分享给大家供大家参考,具体如下:

再谈Yii Framework中的事件event,我写过的关于Yii事件event的另一篇文章。

假设有类MyComponent,它是继承于CComponent,通过查看 CComponent 的 __set() 方法。

  1. public function __set($name,$value
  2.   $setter='set'.$name
  3.   if(method_exists($this,$setter)) 
  4.     return $this->$setter($value); 
  5.   else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name)) 
  6.   { 
  7.     // duplicating getEventHandlers() here for performance 
  8.     $name=strtolower($name); 
  9.     if(!isset($this->_e[$name])) 
  10.       $this->_e[$name]=new CList; 
  11.     return $this->_e[$name]->add($value); 
  12.   } 
  13.   else if(is_array($this->_m)) 
  14.   { 
  15.     foreach($this->_m as $object
  16.     { 
  17.       if($object->getEnabled() && (property_exists($object,$name) || $object->canSetProperty($name))) 
  18.         return $object->$name=$value
  19.     } 
  20.   } 
  21.   if(method_exists($this,'get'.$name)) 
  22.     throw new CException(Yii::t('yii','Property "{class}.{property}" is read only.'
  23.       array('{class}'=>get_class($this), '{property}'=>$name))); 
  24.   else 
  25.     throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.'
  26.       array('{class}'=>get_class($this), '{property}'=>$name))); 

第四行可知,我们可以通过 onXXX 来直接设置事件的。

绑定到全局事件处理

方法一:

直接在main.php里面定义

  1. /*************************************************** 
  2. 在我们想要的内容的前后出现了这些代码 
  3. 只是为了说明,我们添加的内容是要放在 
  4. 这个配置数据的一维里面。 
  5. 'import'=>array( 
  6.   'application.models.*', 
  7.   'application.components.*', 
  8.   'application.helpers.*', 
  9. ), 
  10. 'defaultController'=>'post', 
  11. ***************************************************/ 
  12.  
  13. //其它代码 
  14. 'import'=>array
  15.   'application.models.*'
  16.   'application.components.*'
  17.   'application.helpers.*'
  18. ), 
  19.  
  20. /************** 这才是我们想要添加的代码 **************/ 
  21. 'onBeginRequest' => array('MyEventHandler''MyEventHandlerMethod'), 
  22.  
  23. 'defaultController'=>'post'
  24. //其它代码 

方法二:

//参考自framework/logging/CLogRouter.php的init()方法

Yii::app()->attachEventHandler('onEndRequest',array($this,'processLogs'));

绑定到局部事件处理

随时随地无论在controller还是model里面,只要是CComponent的子类,都可以这样定义。

$myComponent->onClick = $callback;

这里的 $callback 指向了一个有效的 PHP 回调,它可以是一个全局函数也可以是类中的一个方法。

如果是后者,它必须以一个数组的方式提供 : array($object,'methodName')。

Tags: Yii框架事件 event

分享到: