Laravel访问API路由报错:Target class [Api/DndController]不存在
解决Laravel路由报错:Target class [Api/DndController] does not exist
问题原因
Laravel 8及后续版本默认移除了RouteServiceProvider中的$namespace属性配置,因此无法再使用Api/DndController@getData这种简短的控制器路径写法,必须指定完整的控制器命名空间或使用类名语法糖。
解决方案
方案1:使用类名语法糖(推荐)
在routes/api.php中导入控制器类,然后使用[控制器类名::class, 方法名]的方式定义路由:
<?php use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\Api\DndController; // 导入Api目录下的DndController Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth:sanctum'); // 新的路由写法 Route::get('dnd/{type}', [DndController::class, 'getData']);
方案2:指定完整命名空间字符串
如果不想导入类,可以直接在路由中写出控制器的完整命名空间:
Route::get('dnd/{type}', 'App\Http\Controllers\Api\DndController@getData');
方案3:恢复旧版命名空间前缀(不推荐)
若习惯旧版写法,可修改app/Providers/RouteServiceProvider.php,取消$namespace属性的注释并设置对应值,同时在boot方法中传递命名空间:
class RouteServiceProvider extends ServiceProvider { // 取消注释并设置命名空间 protected $namespace = 'App\Http\Controllers'; public function boot() { $this->routes(function () { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) // 添加这行 ->group(base_path('routes/api.php')); Route::middleware('web') ->namespace($this->namespace) // 添加这行 ->group(base_path('routes/web.php')); }); } }
修改后即可继续使用Api/DndController@getData的写法,但此方式不符合Laravel 8+的官方推荐规范。
验证要点
确保你的控制器文件路径为app/Http/Controllers/Api/DndController.php,且文件顶部的命名空间正确:
namespace App\Http\Controllers\Api;
内容的提问来源于stack exchange,提问作者Nikita Skliarov
相关产品推荐
相关产品推荐

