我试图从模块内注册一个事件。因此,我在我的模块类(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?是否有一种更干净的方式来从模块内部注册事件?
模块实例仅在您使用这个特定的模块时创建,同样适用于init
方法。因此,当您访问不同的模块时,事件没有附加,甚至更多,其他模块不知道这一点,因为它们没有任何全局应该注册的信息。
但是您使用user
组件-它保证运行。您可以注册事件onUserRegister(在user
组件)调用一些方法,最好不是从模块,但从更轻的东西,也许一些Points
模型?当然,这破坏了模块化,因为如果你删除PointsModule
,它将破坏user
组件。
也许你可以在配置中附加它,我正在使用以下配置为应用程序组件:
'onBeginRequest' => function()
{
YII_DEBUG? : ob_start("ob_gzhandler");
}
类似:
'user' => [
'onUserRegister' => function()
{
// Handle event here
}
]
旁注:跨模块或更普遍的跨组件交互可能会很棘手。我正在为此目的开发扩展,想法是从整个应用程序聚合事件,并在需要时触发它们。