雖然有很多好的文章介紹怎麼使用事件和怎麼把它們放到你的組件中,但是沒有(我認爲)文章介紹怎麼在你的控制器中使用以下方法配置 CAction 類。
事件通常按以下方式使用:
- 在你的組件中聲明事件並添加它的方法(即 function onClick($event))
- 將事件附加到事件處理程序(event handlers)(即 $object->onClick = array($handleObject, 'staticMethod');)
- 在你的組件中觸發它來調用它的所有處理程序(即 $this->raiseEvent('onClick', $event)).注意,對於處理程序來說,你可以寫一個對象的靜態方法,一個對象的方法,創建一個函數(create_function),甚至可以直接附加一個函數(自 PHP 5.3)
如果我們查看 Ccomponent 的魔術方法 __set, 我們就會發現事件處理程序通常像屬性一樣設置。考慮到這些,以下是我的關於設置 CAction 類的事件處理程序的快速提示,我認爲這是比較好的組織你的控制器的代碼方法。
CAction 類
先寫一個簡單的 CAction 類的例子 EmyAction.php:
class EMyAction extends CAction{
public function onTest($event){
$this->raiseEvent('onTest', $event);
}
public function run() {
$event = new CEvent($this);
$this->onTest($event);
}
}
控制器
現在在我們的控制器中寫一個事件處理程序的方法並且配置這個 action(假設在 controllers文件夾下的actions 文件夾下)
// 我們的事件處理程序的方法,爲簡單起見我們寫在控制器裏面
public function eventHandlerMethod($event)
{
echo 'TESTING Handler';
}
// 聲明 actions 和事件處理程序
public function actions()
{
return array(
// test 是動作的名稱 <controller/action>
'test'=>array(
'class'=>'actions.EMyAction',
'onTest'=>array($this,'eventHandlerMethod')
)
);
}
現在所有代碼都以完成,你可以使用任何瀏覽器來測試結果。
原文地址:http://www.yiiframework.com/wiki/255/using-events-with-caction-classes/