我正在尝试构建一个使用前端框架的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规则将驻留在模块中,而不是主配置文件中。如果我将这些规则存储在主配置中,则设计会失去其预期的模块性。
如何为每个模块覆盖这些配置?
答案 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',
],
];