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 点,虽然通过绑定事件来做一些额外的处理,但同时已经暴露了一个问题,就是协同开发的时候,我不一定知道,