8

我想在 onBeginRequest 事件中运行一些代码。
我在哪里做呢?我假设我不应该在核心库代码中添加它。
我是 Yii 的菜鸟

4

2 回答 2

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');

whereY是一个类名,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 的基类。

于 2011-09-14T17:35:15.913 回答
2

我相信你几乎可以在任何输出开始之前在文件中的任何地方执行此操作,因此它应该在控制器、视图或自定义类中工作,通常位于 Yii Web 应用程序的“受保护”文件夹中。仅供参考,这些文件不是核心文件,可以(几乎)自由编辑,与 Yii 框架文件相对(由引导 index.php 文件中的“$yii”变量引用)。

功能如下:

Yii::app()->onbeginRequest = create_function('$event', 'return function_name_a();');
Yii::app()->onendRequest = create_function('$event', 'return function_name_b();');
于 2011-09-14T00:49:37.870 回答