多模块模式和单模块模式不是 thinkphp 5.1 的新特性,但我还是在这方面栽了个跟头。

5.1 版本后,框架核心可以通过 composer 进行更新。应用配置文件从原来的 config.php 变成了 app.php。多模块模式就属于应用配置这一级别。

模块配置有两个主要应用参数:app_multi_moduleauto_bind_module,其中 app_multi_module 控制是否开启多模块模式。

在开启多模块模式后,应用的路由会先在 route/route.php 查找,是否存在已定义的路由规则,如果不存在,就会在 application 下查找与模块名相同的目录,视其为模块目录,之后在模块目录下接着找控制器,方法等等。

而在未开启多模块模式时,应用就不存在模块的概念,路由直接匹配控制器名、方法名,即查找 application/controller 下是否有相同的控制器名的控制器,之后在控制器内部查找方法。

应用默认开启多模块,如果只有一个模块的话,可以在入口文件中进行模块绑定。auto_bind_module 是否自动绑定模块,在开启多模块后生效。它默认绑定的模块就是默认模块 index,与绑定模块名语句配合使用,可以默认绑定其他模块。5.1 之前的绑定语句 define('BIND_MODULE','index');,到了 5.1 之后调用方法绑定 Container::get('app')->bind('index')->run()->send();

所以如果你在尝试了 N 次访问路由失败后,可以检查一下多模块的开启状态以及是入口否自动绑定模块,可能会有意外收获。