TP6 多应用模式出现 Route not found,通常是未开启多应用配置、路由文件位置不对或控制器命名空间未调整,优先检查 config/app.php 中的 auto_multi_app 设置。
先说结论:大部分情况是配置未生效、路由文件放错位置或控制器命名空间未同步调整,按顺序检查配置开关、目录结构及命名空间即可。
- 先确认:config/app.php 中 auto_multi_app 是否为 true
- 先处理:将路由文件移动到对应应用目录 app/[app_name]/route.php,并修改控制器 namespace
- 再验证:清除 runtime 缓存后访问特定应用 URL,检查服务器伪静态
问题根源与目录结构
ThinkPHP 6 默认是单应用模式,所有路由定义在全局 route 目录下。开启多应用后,框架会尝试根据 URL 中的应用名加载对应应用目录下的配置和路由。如果配置没开,框架找不到应用目录;如果路由文件还在全局目录,多应用模式下可能不会被正确加载。此外,控制器文件必须移动到应用子目录并修改命名空间,否则会导致类找不到错误。
标准的多应用目录结构参考如下:
app/
├── admin/ # 应用目录
│ ├── controller/ # 控制器目录
│ │ └── Index.php # 需修改 namespace 为 app\admin\controller
│ ├── route.php # 应用路由文件
│ └── config/ # 应用配置
├── api/ # 另一个应用
│ ├── controller/
│ └── route.php
└── common/ # 公共模块(可选)
详细处理步骤
核心在于配置和目录调整,但需确保服务器伪静态规则正确配置,否则仍无法访问。
1. 开启多应用模式
打开 config/app.php,找到 auto_multi_app 选项,确保值为 true。如果不存在,手动添加。
'auto_multi_app' => true,2. 调整目录与命名空间
确保你的应用目录在 app 下,例如 app/admin,app/api。每个应用目录下应有自己的 route.php 和 controller 目录。
关键点:控制器文件移动到应用目录后,必须修改文件头部的 namespace。例如 app/admin/controller/Index.php:
<?php
namespace app\admin\controller; // 必须包含应用名 admin
class Index
{
public function index()
{
return 'hello';
}
}3. 配置服务器伪静态
所有请求需指向 public/index.php。以下是常见服务器配置示例:
Nginx 配置:
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}Apache 配置 (.htaccess):
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>4. 清除缓存
修改配置后,务必删除 runtime 目录下的缓存文件,或使用命令清除。
php think clear验证与排查
访问 http://yourdomain.com/admin/index/index 类似 URL。如果不再报 Route not found 且能正常进入控制器,说明修复成功。
排查步骤:
- 检查 runtime/log 目录下是否有新的错误日志,确认是否为类找不到或路由匹配失败。
- 使用
php think route:list查看当前已注册路由,确认应用路由是否加载。 - 确认 public 目录权限是否正确,确保服务器可读写 runtime 目录。
常见坑
- 命名空间未改:仅调整目录而不修改控制器 namespace 会导致类找不到错误,这是多应用模式最常见的问题。
- 中间件配置:多应用模式下,中间件可能需要绑定到具体应用,全局中间件配置可能不生效。
- 默认应用名:如果 URL 中没有带应用名,框架可能无法识别默认应用,需在配置中指定 default_app。
- 缓存未清:修改配置后忘记清除 runtime 缓存,导致旧配置依然生效。
- 伪静态缺失:服务器未配置伪静态规则,导致请求无法正确转发到 index.php,表现为 404 而非框架错误。
参考来源
- ThinkPHP 6.0 完全开发手册 - 多应用模式,kancloud.cn/manual/thinkphp6_0/1037490
- ThinkPHP 6.0 完全开发手册 - 路由,kancloud.cn/manual/thinkphp6_0/1037479