使用 Laravel 8 时出现错误“目标类控制器不存在”

2022-08-30 06:07:05

这是我的控制器:

<?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');
    }
}

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

Enter image description here

我的 api.php 路由:

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

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

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

我该如何修复它?


多亏了答案,我才能够修复它。我决定对此路由使用完全限定的类名,但还有其他选项,如答案中所述。

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

答案 1

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

“在之前版本的Laravel中,包含一个属性。此属性的值将自动作为前缀添加到控制器路由定义和对帮助程序/方法的调用上。在 Laravel 8.x 中,此属性是默认的。这意味着Laravel不会自动命名空间前缀。Laravel 8.x 文档 - 发行说明RouteServiceProvider$namespaceactionURL::actionnull

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

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属性:

虽然在发行说明中提到了要在您的上设置的属性,并在您的注释中注释,但这不会对您的路线产生任何影响。它目前仅用于添加命名空间前缀以生成操作的 URL。因此,您可以设置此变量,但它本身不会添加这些命名空间前缀,您仍然必须确保在将命名空间添加到路由组时使用此变量。$namespaceRouteServiceProviderRouteServiceProvider

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

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

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

同样,我再怎么强调也不过分,重要的部分是为路由组设置命名空间,它们只是碰巧通过在示例中直接引用成员变量来执行此操作。$namespace

更新:

如果您自版本 8.0.2 以来安装了 Laravel 8 的新副本,则可以在 中取消注释成员变量以返回到旧方式,因为路由组设置为将此成员变量用于组的命名空间。laravel/laravelprotected $namespaceRouteServiceProvider

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

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

...
->namespace($this->namespace)
...

答案 2
  • 是的,在Laravel 8中确实发生了此错误。
  • 在尝试了许多解决方案之后,我得到了这个完美的解决方案。
  • 只需按照步骤操作...

案例1

我们可以在api.phpweb.php文件中进行更改,如下所示。我们目前的写作方式是syntax

Route::get('login', 'LoginController@login');

这应该改为:

Route::get('login', [LoginController::class, 'login']);

案例 2

  1. 首先转到文件:应用>提供程序> RouteServiceProvider.php

  2. 在该文件中,将受保护的行$namespace = null;替换为受保护的$namespace = 'App\Http\Controllers';

    Enter image description here

  3. 然后添加行 ->namespace($this->namespace),如图所示...

    Enter image description here


推荐