Yii Framework框架中事件和行为的区别及应用实例分

本文实例讲述了Yii Framework框架中事件和行为的区别及应用。分享给大家供大家参考,具体如下:

个人觉得,在 Yii 里面,最难以明白的就是事件(Event)和行为(behavior)了。这不仅仅是因为它们的概念

比较难明,关键是它们的应用场景比较难明,不知道什么时候应该使用事件和行为来开发。

关于 Yii 的事件和行为的描述,可参考 http://www.yiiframework.com/doc/api/1.1/CComponent

本文参考的文章:

http://www.larryullman.com/2010/07/20/forcing-login-for-all-pages-in-yii/
http://www.yiiframework.com/wiki/44/behaviors-events/

事件

事件模型就是设计模式中的“观察者模式”:当对象的状态发生了变化,那么这个对象可以将该事件通知其它对象。
为了使用事件模型,需要实现这三个步骤:1、定义事件;2、注册事件句柄;3、触发事件。

为什么要做这三个步骤呢?因为对于 PHP 本身,它的执行过程不是以进程化来运行的,
所以 Yii 的事件触发机制不会像 ActionScript 3+ 那样,直接将触发事件。
有人说,Yii 的事件概念跟 js 中的事件概念差不多,因为 Yii 是将事件绑定到 Yii::app() 的执行过程中。
由于本人对于 js 的事件没有做过深入的了解,这里不敢贸然否定,或者肯定。

费话少说,先看这样的应用场景:

我想在请求过来的时候,先将请求的 IP 的记录到数据库,然后才进行对应的相应的请求处理。

1. 通过编辑 components/Controller.php 的构造方法来处理。

如代码:

class Controller extends CController
{
  public function __construct()
  {
    parent::__construct();
    //将请求的 IP 记录到数据库
  }
}

2. 通过使用事件来处理。

我们来分析一个 framework/base/CApplication.php 的 run() 方法

public function run()
{
  if($this->hasEventHandler('onBeginRequest'))
    $this->onBeginRequest(new CEvent($this));
  $this->processRequest();
  if($this->hasEventHandler('onEndRequest'))
    $this->onEndRequest(new CEvent($this));
}

从代码可以看出来,在处理请求之前,Yii 首先会判断一下当前有没有处理 onBeginRequest 的函数或者类的方法绑定了,

如果有这样的函数或者类的方法存在,则先执行了它们,然后再处理请求。

那么,怎样写 onBeginRequest,或者怎样去调用呢?

方法一:修改 index.php

一般来说,我们的 index.php 最后一句是:

Yii::createWebApplication($config)->run();

我们在这里将它改造一下,改成:

$app = Yii::createWebApplication($config);
Yii::app()->onBeginRequest=function($event) {
  //将请求的 IP 记录到数据库
};
Yii::app()->onBeginRequest=function($event) {
  //其它的你想要处理的内容,比如说,生成一个文件
  //file_put_contents('onBeginRequest.txt', '阿妈,我得左啦!');
};
$app->run();


      

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5072.html