2011-09-14 32 views

回答

15

如果你想使用onBeginRequest和onEndRequest你可以做到這一點通過加入下一行到您的配置文件:

return array (
... 
'onBeginRequest'=>array('Y', 'getStats'), 
'onEndRequest'=>array('Y', 'writeStats'), 
... 
) 

,或者你可以做它內嵌

Yii::app()->onBeginRequest= array('Y', 'getStats'); 
Yii::app()->onEndRequest= array('Y', 'writeStats'); 

其中Y是一個類名getStatswriteStats是這個類的方法。 現在想象你有聲明如下一類Y

class Y { 
    public function getStats ($event) { 
     // Here you put all needed code to start stats collection 
    } 
    public function writeStats ($event) { 
     // Here you put all needed code to save collected stats 
    } 
} 

所以在每次請求這兩種方法都會自動運行。當然你可以想「爲什麼不簡單地重載onBeginRequest方法?」但首先事件允許你不擴展類來運行一些重複的代碼,並且它們允許你執行在不同地方聲明的不同類的不同方法。 所以,你可以在你的應用程序的任何其他部分添加

Yii::app()->onEndRequest= array('YClass', 'someMethod'); 

與以前的事件處理一起,您將得到請求處理後同時運行Y->writeStatsYClass->someMethod。這與行爲允許您創建幾乎任何複雜性的擴展組件,無需更改源代碼,也不需要擴展Yii的基類。

+0

那麼在項目結構中,如果我將它添加到配置文件中,那麼clas將會生存在哪裏? – RicardoE

1

我相信你可以在你的文件,這樣做幾乎任何地方的任何輸出開始之前,所以應該在控制器,視圖或自定義類的工作,通常位於「保護「Yii網絡應用程序中的」文件夾「。僅供參考,這些文件不是核心文件,並且可以(幾乎)自由編輯,與Yii框架文件相同(如bootstrap index.php文件中的「$ yii」var所引用的那樣)。

的功能如下所示:

Yii::app()->onbeginRequest = create_function('$event', 'return function_name_a();'); 
Yii::app()->onendRequest = create_function('$event', 'return function_name_b();'); 
+3

聞起來像一個eval ... –

+0

你問它是怎麼做... – ldg

+0

你可以做'的Yii ::應用程序() - > onendRequest =函數(){//做財產以後};' –