TP6 多应用模式下路由报错 Route not found 如何处理

文章导读
TP6 多应用模式出现 Route not found,通常是未开启多应用配置、路由文件位置不对或控制器命名空间未调整,优先检查 config/app.php 中的 auto_multi_app 设置。
📋 目录
  1. A 问题根源与目录结构
  2. B 详细处理步骤
  3. C 验证与排查
  4. D 常见坑
  5. E 参考来源
A A

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/                # 公共模块(可选)

详细处理步骤

核心在于配置和目录调整,但需确保服务器伪静态规则正确配置,否则仍无法访问。

TP6 多应用模式下路由报错 Route not found 如何处理

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:

TP6 多应用模式下路由报错 Route not found 如何处理
<?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):

TP6 多应用模式下路由报错 Route not found 如何处理
<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 而非框架错误。

参考来源