You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:13:10