
laravel 9 默认禁用字符串形式的控制器路由语法(如 `'admintoolscontroller@php'`),必须显式使用数组语法并引入完整命名空间,否则会报错 “target class does not exist”。
在 Laravel 9 中,为提升类型安全与 IDE 支持,框架已正式移除对字符串式控制器路由语法(如 'ControllerName@method')的默认支持。这意味着即使控制器文件存在、命名空间正确、类名无误,仅因路由定义方式不当,就会触发 Target class [AdminToolsController] does not exist 错误。
✅ 正确做法是:使用数组语法 [Controller::class, 'method'],并确保控制器类被正确引入或使用完整命名空间。
✅ 推荐写法(清晰、可维护、符合 PSR-4)
// routes/web.php
use App\Http\Controllers\AdminToolsController;
Route::get('/php', [AdminToolsController::class, 'php']);✅ 替代写法(无需 use 语句,适合单次引用)
// routes/web.php
Route::get('/php', [\App\Http\Controllers\AdminToolsController::class, 'php']);⚠️ 注意事项:
-
确保控制器位于 app/Http/Controllers/ 目录下,且类声明包含正确命名空间:
若控制器继承自 Controller,请确认已导入:use App\Http\Controllers\Controller;
运行 php artisan route:clear 和 php artisan config:clear 清理缓存(尤其在迁移旧项目后);
字符串语法(如 'AdminToolsController@php')不会自动解析命名空间,Laravel 9 不再尝试猜测路径,因此该写法将始终失败。
? 小结:这不是“找不到文件”的问题,而是路由解析机制升级所致。拥抱数组语法不仅能解决当前错误,还能获得更好的静态分析、自动补全和重构支持——这是 Laravel 向更现代 PHP 实践迈出的重要一步。











