Yii2 模块嵌套这一类的文章网上有很多了,也看了不少,只是觉得实用合适的才是最好的,我自己是这么配置的,记一下以防忘记。
在做一个前后端分离项目的后台时,后台的API需要加入版本识别,参考了很多文章,还是觉得用Yii的子模块划分版本最实际,也好维护一点。
假设v1版本有这样几个模块(随便写的,不要太在意细节):
- v1
- admin
- menu
- test
- menu
- admin
他们的关系是嵌套的,那访问最后一个test模块的Index控制器里的Test方法,理论上路径是这样的:
/v1/admin/menu/test/index/test
目录结构大概是这样的:
backend
└ ┈modules
└ ┈ v1
└ ┈ modules
└ ┈admin
└ ┈ modules
└ ┈ menu
└ ┈ modules
└ ┈ test
└ ┈ controllers
└ ┈ IndexController.php
要支持四级的模块嵌套,不配置一下是不能成功访问的,先来配置一下 main.php 中的 modules :
'modules' => [
'v1' => [
'class' => 'backend\modules\v1\Module',
'modules' => [
'admin' => [
'class' => 'backend\modules\v1\modules\admin\Module',
'modules' => [
'menu' => [
'class' => 'backend\modules\v1\modules\admin\modules\menu\Module',
'modules' => [
'test' => [
'class' => 'backend\modules\v1\modules\admin\modules\menu\modules\test\Module',
]
]
]
]
],
],
],
],
这里没有采用在Module.php中把子模块写死的方法,这里使用配置文件的写法是因为可以利用程序写入配置文件,能灵活的控制模块的取舍。
模块配置完了,现在该配置URL美化了,如下:
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
[
//一个规则就解决了
'pattern' => '<path:([\w-]+\/?)+>',
'route' => '<path>',
],
]
],
],
一条规则,就解决了无限子模块嵌套的URL美化,至此,Yii2 子模块嵌套就可以正常访问了。如果在程序上实现后台安装卸载模块,并自动写入配置,理论上你可以实现无限制的模块嵌套。