ThinkPHP6多级控制器必须严格匹配命名空间与物理路径,如app/index/controller/api/v1/User.php对应namespace app\index\controller\api\v1;目录全小写、无短横线或驼峰;URL用点号分隔(/index/api.v1.user/index),路由需手动配置;新增目录后须执行composer dump-autoload -o。
ThinkPHP 6 多级控制器目录怎么建才不报错
必须严格匹配命名空间与物理路径,否则
会直接抛出,不是路由 404 那种“还能调试”的错误。
比如想建
,对应类必须声明为:
目录名全部小写,不能含短横线(
❌)、不能驼峰(
❌)
访问 URL 是
(点号分隔),不是斜杠 —— 这是 TP6 默认规则,改不了
若想用
这种风格,必须配路由:
别漏掉
,新增多级目录后自动加载不会自动刷新
多应用 + 多级控制器混用时 route.
php
怎么加载
每个应用的
只负责本应用内控制器,但多级控制器的路由注册位置容易搞混:它必须写在对应应用的
里,而不是全局
目录下。
例如
中要这样写才能命中
:
立即学习
“
PHP免费学习笔记(深入)
”;
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
TP6 不会自动拼接应用名前缀,
的命名空间已隐含
如果在
里写
,会去
找,必然失败
命令行查路由:
指定应用,否则默认只扫
为什么 config/app.php 里的
和
不生效
这两个配置项只对「单应用模式」下的扁平控制器结构起作用;一旦启用多应用(即
下有多个子目录),框架就绕过它们,直接按目录层级推导命名空间。
在 TP5 有用,在 TP6 多应用下完全被忽略
同样无效 —— TP6 要求控制器类名就是文件名,不加后缀(
→
类)
如果你硬要保留
,就得手动改命名空间和类名,并确保 PSR-4 映射正确,但官方不推荐
真正控制多级行为的是
里的
中间件是否启用,以及 URL 解析逻辑
模板路径和视图赋值怎么匹配多级控制器
默认视图路径是
,其中「控制器路径」会把点号转成斜杠 —— 这个转换是自动的,但容易被忽略。
比如访问
,框架会尝试加载:
你不用在控制器里写
,直接
就行
如果模板放在
,那对应控制器必须是
,且方法叫
传的数据,在所有层级模板里都可用,没隔离机制 —— 跨应用共享数据得靠 session 或缓存,别依赖视图层传递
最常被跳过的其实是命名空间和目录名大小写一致性:哪怕只是把
建成
,Linux 服务器上就直接 500,Windows 开发机却能跑——这种环境差异问题,上线前必须用真实部署环境验证一遍。
ClassNotFoundExceptionapp/index/controller/api/v1/User.phpnamespace app\index\controller\api\v1;
use think\Controller;
class User extends Controller
{
public function index()
{
return 'v1 user';
}
}api-v1ApiV1/index/api.v1.user/index/api/v1/userRoute::get('api/v1/user', 'api/v1.User/index')composer dump-autoload -oroute.phproute.phproute/app/api/route.phpapp/api/controller/v2/Order.phpuse think\facade\Route;
Route::get('order', 'v2.Order/index'); // 注意:这里用的是 'v2.Order/index',不是 'api/v2.Order/index'v2.Order/indexapp\api\controllerapp/index/route.phpRoute::get('api/v2/order', 'v2.Order/index')app/index/controller/v2/php think route:list --app=apiindexcontroller_layercontroller_suffixapp/controller_layer = 2controller_suffix = 'Controller'User.phpUserUserController.phpapp/middleware.phpBindview/[应用名]/[控制器路径]/[方法名].html/index/api.v1.user/indexview/index/api/v1/user/index.html$this->fetch('api/v1/user/index')$this->fetch()view/admin/v2/order/detail.htmlapp/admin/controller/v2/Order.phpdetail$this->assign()app/apiApp/Api