在我的Yii2项目中,我试图使用以下目录结构来组织我的控制器:
/controllers/ReportController.php
/controllers/report/Report1Controller.php
/controllers/report/Report2Controller.php
/controllers/report/Report3Controller.php
命名空间为
appcontrollers
appcontrollersreport
appcontrollersreport
appcontrollersreport
所有控制器包含
public function actionIndex()
函数。
访问URL
https://myreporting.test/report
正确路由到
controllers/ReportController.php - actionIndex()
当我试图访问URL
时https://myreporting.test/report/report1
返回404错误,而不是路由到
controllers/report/Report1Controller.php - actionIndex()
我如何才能实现框架正确路由到子目录中控制器的索引操作?主ReportController不包含任何具有冲突名称的操作。
你必须设置url管理器来识别这样的路由。你可以在你的web.php配置中这样做。例如:
'components' => [
'urlManager' => [
'class' => yiiwebUrlManager::class,
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'report/<controller:w+>/<action:w+>/<id:(d|w)+>' => 'report/<controller>/<action>',
'report/<controller:w+>/<action:w+>' => 'report/<controller>/<action>',
'<controller:w+>/<action:w+>/<id:(d|w)+>' => '<controller>/<action>',
'<controller:w+>/<action:w+>' => '<controller>/<action>',
],
],
// ... other components ...
].
// ... other configurations ...
你也可以动态设置文件夹部分,例如使用如下规则
'<folder:w+>/<controller:w+>/<action:w+>' => '<folder>/<controller>/<action>'
但我不建议这样做,因为模块也使用了类似的模式。