yii2如何覆盖每个模块的配置

时间:2016-03-17 14:11:25

标签: yii2

我正在尝试构建一个使用前端框架的yii2应用程序(在我的情况下,如果重要的话,就是riotjs)。为此,yii2-app-basic和yii2-app-advanced并不能满足我的需求,所以我通过以下方式创建了自己的结构:

/controllers
    /IndexController.php
/modules
    /v1
        /Module.php
        /users
            /Module.php
            /controllers
        ...
/themes
    /v1
        /layouts
            /main.php
        /index
            /index.php
        /partials
            /navpanel.js
        /assets
            (bower assets here because it is still in the dev phase)
/config
    /main.php
    /main-local.php
/public
    /index.php
    /assets

与此问题相关的配置:

'defaultRoute' => 'index/index',
'components' => [
    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'rules' => [
            '_api/<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>'
        ]
    ],
    'errorHandler' => [
        'errorAction' => 'index/index'
    ],
    'view' => [
        'theme' => [
            'basePath' => '@app/themes/v1',
            'baseUrl' => '@app/themes/v1',
            'pathMap' => ['@app/views' => '@app/themes/v1']
        ]
    ]
],
'modules' => [
    'v1' => [
        'class' => 'app\modules\v1\Module'
    ]
]

因此,所有后端逻辑都存储在子模块中,子模块由其父模块进行版本控制。这允许我模块化地为api创建新版本。主题也是如此。 url管理器中存在的规则是为所有模块添加_api/作为前缀。默认路由和错误处理程序调度到同一个操作,因为riotjs将处理错误(例如,如果有人打开浏览器并转到不存在的路由,首先riotjs模板将被渲染,然后riotjs将显示“页面不存在”的对话框。)

现在这就是我被困住的地方。我想为父模块和子模块提供不同的配置。我希望主模块有一个不同的,基于JSON的错误处理程序。其次,我想将所有URL规则保留在子模块中。因此,模块用户的REST规则将驻留在模块中,而不是主配置文件中。如果我将这些规则存储在主配置中,则设计会失去其预期的模块性。

如何为每个模块覆盖这些配置?

1 个答案:

答案 0 :(得分:1)

在Module.php中

public function init()
{

    parent::init();
    Yii::$app->setComponents(require(__DIR__ . '/config.php'));
}

和config.php示例:

return [
   'response' => [
      'format'=>'json',
      'class' => 'yii\web\Response',
   ],
];