我正在尝试从模块中注册一个事件。所以,我在模块类(protected/modules/points/PointsModule.php
)的init函数中添加了这几行。
class PointsModule extends CWebModule {
public function init() {
...
// Attach the "User Register" event
Yii::app()->user->onUserRegister = array($this, "addPointsForRegistration");
die('init');
}
...
}
我在使用模块控制器时只看到die('init')
的结果。我申请的任何其他页面都不会做任何事情。
我在config/main.php
文件
'import'=>array(
'application.modules.points.*',
),
我不明白我在这里做错了什么。如果我没有使用模块的控制器,那么文件似乎根本没有加载 有没有办法在yii中的每个页面加载时加载模块类(或另一个组件)?有没有更简洁的方法从模块内部注册事件?
答案 0 :(得分:1)
仅当您使用此特定模块时才会创建模块实例,这同样适用于init
方法。因此,当您访问不同的模块事件时,没有附加,更多,其他模块不知道这一点,因为他们没有任何信息应该注册全局。
但是你使用user
组件 - 保证运行。您可以在onUserRegister(在user
组件中)注册事件来调用某个方法,而不是来自模块,而是来自更轻松的东西,可能是某些Points
模型?当然,这会破坏模块化,因为如果您删除PointsModule
,它将会破坏user
组件。
也许你可以在配置中附加它我正在使用以下配置为应用程序组件:
'onBeginRequest' => function()
{
YII_DEBUG? : ob_start("ob_gzhandler");
}
类似的东西:
'user' => [
'onUserRegister' => function()
{
// Handle event here
}
]
旁注:交叉模块或更常见的跨组件交互迁移是棘手的。我正在为此目的开发extension,想法是从整个应用程序聚合事件并在需要时触发它们。