小编典典

目标类控制器不存在 - Laravel 8

all

这是我的控制器:

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        dd('aa');
    }
}

如屏幕截图所示,该类存在并且位于正确的位置:

在此处输入图像描述

我的api.php路线:

Route::get('register', 'Api\RegisterController@register');

当我register使用 Postman 到达我的路线时,它给了我以下错误:

目标类 [Api\RegisterController] 不存在。


更新:

感谢答案,我能够修复它。我决定为此路线使用完全限定的类名,但还有其他选项,如答案中所述。

Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');

阅读 94

收藏
2022-05-16

共1个答案

小编典典

您正在使用 Laravel 8。在全新安装的 Laravel 8 中,没有将命名空间前缀应用于您的路由加载到的路由组。

“在以前的 Laravel
版本中,RouteServiceProvider包含一个$namespace属性。该属性的值将自动添加到控制器路由定义和对action助手/URL::action方法的调用中。在
Laravel 8.x 中,该属性是null默认设置的。这意味着没有自动命名空间前缀将由 Laravel 完成。” Laravel 8.x 文档
- 发行说明

当不使用命名空间前缀时,在路由中引用控制器时,您必须为控制器使用完全限定的类名。

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
// or
Route::get('/users', 'App\Http\Controllers\UserController@index');

如果您更喜欢旧方式:

App\Providers\RouteServiceProvider

public function boot()
{
    ...

    Route::prefix('api')
        ->middleware('api')
        ->namespace('App\Http\Controllers') // <---------
        ->group(base_path('routes/api.php'));

    ...
}

对您想要为其声明命名空间的任何路由组执行此操作。

物业$namespace

尽管在发行说明中提到了$namespace要在您身上设置的属性并在您的评论中对此进行了评论,但这对您的路线没有任何影响。它目前仅用于添加命名空间前缀以生成操作的
URL。所以你可以设置这个变量,但它本身不会添加这些命名空间前缀,你仍然必须确保在将命名空间添加到路由组时使用这个变量。RouteServiceProvider``RouteServiceProvider

此信息现在位于升级指南中

Laravel 8.x 文档 - 升级指南 - 路由

升级指南显示的 重要 部分是您在路由组上定义命名空间。单独设置$namespace变量 有助于生成操作的 URL。

再一次,我不能强调这一点, 重要 的部分是为路由组设置命名空间,他们恰好通过$namespace在示例中直接引用成员变量来做到这一点。

更新:

如果您从 8.0.2 版开始安装了 Laravel 8 的新副本,则laravel/laravel可以取消注释中的protected $namespace成员变量RouteServiceProvider以返回旧方式,因为路由组已设置为将此成员变量用于组的命名空间。

// protected $namespace = 'App\\Http\\Controllers';

取消注释会将命名空间前缀添加到分配给路由的控制器的 唯一原因是因为路由组设置为使用此变量作为命名空间:

...
->namespace($this->namespace)
...
2022-05-16