我想在onBeginRequest事件中运行一些代码 我在哪里这样做?我假设我不想在核心库代码中添加它 我在Yii是一个完全的菜鸟
答案 0 :(得分: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
是一个类名,getStats
和writeStats
是此类的方法。
现在想象你有一个类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->writeStats
和YClass->someMethod
。这种行为允许您创建几乎任何复杂性的扩展组件,而无需更改源代码,也无需扩展Yii的基类。
答案 1 :(得分:2)
我相信你可以在任何输出开始之前在你的文件中的任何地方做到这一点,所以它应该在控制器,视图或自定义类中工作,通常位于" protected" Yii网络应用程序中的文件夹。仅供参考,这些文件不是核心文件,可以(几乎)自由编辑,与Yii框架文件相关(由引导索引.php文件中的" $ yii" var引用)。 p>
函数看起来像:
Yii::app()->onbeginRequest = create_function('$event', 'return function_name_a();');
Yii::app()->onendRequest = create_function('$event', 'return function_name_b();');