Yii - 由于未加载模块类,因此未触发事件

时间:2013-06-10 15:18:13

标签: php yii yii-events

我正在尝试从模块中注册一个事件。所以,我在模块类(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中的每个页面加载时加载模块类(或另一个组件)?有没有更简洁的方法从模块内部注册事件?

1 个答案:

答案 0 :(得分:1)

仅当您使用此特定模块时才会创建模块实例,这同样适用于init方法。因此,当您访问不同的模块事件时,没有附加,更多,其他模块不知道这一点,因为他们没有任何信息应该注册全局。

但是你使用user组件 - 保证运行。您可以在onUserRegister(在user组件中)注册事件来调用某个方法,而不是来自模块,而是来自更轻松的东西,可能是某些Points模型?当然,这会破坏模块化,因为如果您删除PointsModule,它将会破坏user组件。

也许你可以在配置中附加它我正在使用以下配置为应用程序组件:

'onBeginRequest' => function()
     {
         YII_DEBUG? : ob_start("ob_gzhandler");
     }

类似的东西:

'user' => [
    'onUserRegister' => function()
    {
        // Handle event here
    }
]

旁注:交叉模块或更常见的跨组件交互迁移是棘手的。我正在为此目的开发extension,想法是从整个应用程序聚合事件并在需要时触发它们。