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

时间:2021-05-25

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

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

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

关于 Yii 的事件和行为的描述,可参考 http://ponents.*', 'application.helpers.*',),/************** 这才是我们想要添加的代码 **************/'onBeginRequest' => array('MyEventHandler', 'MyEventHandlerMethod'),'defaultController'=>'post',//其它代码

关于 onBeginRequest 的使用,它必须是一个有效的 PHP 回调。

即,一个指匿名函数,全局函数名的字符串或一个数组。如果是数组,那么该数组包含两个元素,第一个元素是一个对象,第二个元素是这个对象的方法。
由此可见,方法一和方法二还是有点区别的。使用方法二的时候,只能注册一个 PHP 回调,而使用方法一,可以是不同的 PHP 回调。当然,这里说的方法二
只能注册一个 PHP 回调是指,对整个请求处理过程中肯定会执行的 PHP 回调,在其它地方需要的时候,也可以加上你想实现的功能。

3. 另一个例子,来说明自己是怎样定义一个事件的。

打开 models/ContactForm.php,输入

/** * 自己定义发送邮件事件 * @param unknown_type $event */public function onSendMail($event){ $this->raiseEvent('onSendMail',$event);}/** * 验证成功,执行 * @see CModel::afterValidate() */public function afterValidate() { if($this->hasEventHandler('onSendMail')) $this->onSendMail(new CEvent($this));}

这里我们定义了一个 onSendMail 事件,并在 Validate 验证后,触发此事件。

打开 controllers/SiteController.php,将修改actionContact修改为以下内容

public function actionContact(){ $model=new ContactForm; $model->onSendMail=function($event) { $headers="From: {$event->sender->email}\r\nReply-To: {$event->sender->email}"; mail(Yii::app()->params['adminEmail'],$event->sender->subject,$event->sender->body,$headers); }; if(isset($_POST['ContactForm'])) { $model->attributes=$_POST['ContactForm']; if($model->validate()) { Yii::app()->user->setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.'); $this->refresh(); } } $this->render('contact',array('model'=>$model));}

上面的 3 点,虽然通过绑定事件来做一些额外的处理,但同时已经暴露了一个问题,就是协同开发的时候,我不一定知道,

其他开发人员写了哪些事件的 PHP 回调,在处理过程中到底会调用哪些事件的 PHP 回调。或者说,这个 PHP 回调在什么时候创建的,

或者说你在为组件添加事件处理函数时,找不到合适的时候,如果添加早了,组件还没创建,如果添加晚了,事件不被执行,有可能组件已经执行完了。

我们需要一个类似于配置文件的东西,将存在的事件处理组织起来,统一管理。这个时候,行为可以用上了。

行为

这里先重新描述一下为什么要使用行为。

有两种办法可以对类添加特性:

1、直接修改这个类的代码,添加一些成员函数和成员变量;
2、派生,通过子类来扩展。

很明显第二种方法更加易维护、易扩展。但是如果需要对一个类添加多个特性(多人在不同时期),那么需要进行多级派生,这显然加大了维护成本。

在 Yii 里面,通过行为类绑定,组件将一个或多个 CBehavior 类的成员方法和成员变量添加到自己身上,并且在不需要的时候载掉某些 CBehavior 类。

同时,可以通过重写 CBehavior::events 的方法,来实现对目标类的多个事件绑定。这些事件将会在当前行为绑定到目标类的时候,一起被绑定上。

下面我们以代码来具体看一下这个行为特性。

在 protected 创建目录 behaviors,并在protected/behaviors目录下创建ApplicationBehavior.php,输入如下代码:

<?phpclass ApplicationBehavior extends CBehavior { public function events() { return array_merge(parent::events(),array( 'onBeginRequest'=>'beginRequest' )); } public function beginRequest($event) { echo "我已经将 onBeginRequest 的事件处理通过行为绑定了"; }}

此行为文件,是要为 CApplication 服务,仔细查看这个行为文件,我们可以看到,events 方法定义了些行为可以处理的事件,

上面的类,可以处理 onBeginRequest 事件,当然如果你自己定义的组件也有一个叫做 onBeginRequest 方法,你也可以使用此行为

后面的 beginRequest 就是事件的处理函数,这个处理函数必须要有行为类中定义。

跟上面的事件一样,也有两种方法将此行为类附加到 CApplication。

方法一:

打开 index.php,输入下面代码

$app = Yii::createWebApplication($config);Yii::app()->onBeginRequest=function($event) { //将请求的 IP 记录到数据库};Yii::app()->onBeginRequest=function($event) { //file_put_contents('onBeginRequest.txt', '阿妈,我又得左啦!');};/****** 这句才是我们想要的东东 *********/$app->attachBehavior('app', 'application.behaviors.ApplicationBehavior');$app->run();

刷新页面,你将会在头部看到一行 “我已经将 onBeginRequest 的事件处理通过行为绑定了”

方法二:

如果对 Yii 的组件定义了解的话,应该知道每一个组件,都有一个behaviors方法,该方法中定义的相关行为,在组件初始化时,会自动附件,

下面我们就为 CApplication 定义 behaviors,由于 CApplication 是系统级类,我们可以扩展此类,并添加behaviors方法。这里补充一下,

CApplication 是会根据 config/main.php 配置进行初始化,那么我们就可以将 behaviors 定义在 main.php。

打开 protected/config/main.php,加入如下代码:

'behaviors' => array( 'app' => 'application.behaviors.ApplicationBehavior',),

刷新页面,你也会在头部看到一行 “我已经将 onBeginRequest 的事件处理通过行为绑定了”

通过以上的例子,希望相关读者对 Yii 的事件和行为有一定的了解。

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章