Yii Framework框架中事件和行为的区别及应用实例分(2)
方法二:在配置文件 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',
//其它代码
关于 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 点,虽然通过绑定事件来做一些额外的处理,但同时已经暴露了一个问题,就是协同开发的时候,我不一定知道,
