1

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

4

1 回答 1

1

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

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

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

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

就像是:

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

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

于 2013-06-10T17:01:09.350 回答