3

Yii 事件的灵活性给我留下了深刻的印象。我是 Yii 新手,我想知道如何将参数传递给 Yii 事件处理程序?

//i have onLogin event defined in the login model
public function onLogin($event)
{
  $this->raiseEvent("onLogin", $event);
}

我在处理程序类中定义了一个登录处理程序。此事件处理程序方法接受一个参数:

function loginHandler($param1)
{
  ...
}

但是在这里,我对如何将参数传递给登录事件处理程序感到困惑:

//i attach login handler like this.
$loginModel->onLogin = array("handlers", "loginHandler");
$e = new CEvent($this);
$loginModel->onLogin($e);

难道我做错了什么?有另一种方法吗?

4

2 回答 2

3

现在我对自己的问题有了答案。CEvent 类有一个名为params的公共属性,我们可以在其中添加其他数据,同时将其传递给事件处理程序。

//while creating new instance of an event I could do this
$params = array("name" => "My Name"); 
$e = new CEvent($this, $params);
$loginModel->onLogin($e);

 //adding second parameter will allow me to add data which can be accessed in 
// event handler function. loginHandler in this case.
function loginHandler($event)// now I have an event parameter. 
{
   echo $event->params['name']; //will print : "My Name"

}
于 2013-05-19T13:19:34.743 回答
1

如果您想使用 onBeginRequest 和 onEndRequest ,您可以通过将下一行添加到配置文件中来实现:

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

或者你可以内联

Yii::app()->onBeginRequest= array('Y', 'getStats');
Yii::app()->onEndRequest= array('Y', 'writeStats');`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 的基类。

于 2013-05-19T06:48:28.030 回答