我对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);
我做错了吗?还有另一种方法吗?
答案 0 :(得分: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"
}
答案 1 :(得分: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的基类。