事件没有被触发,因为模块类没有被加载


Yii - Event not fired because the module class is not loaded

我试图从模块内注册一个事件。因此,我在我的模块类(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
    }
]

旁注:跨模块或更普遍的跨组件交互可能会很棘手。我正在为此目的开发扩展,想法是从整个应用程序聚合事件,并在需要时触发它们。