这是我的控制器:

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

当我使用Postman命中我的寄存器路径时,它给了我以下错误:

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

我该怎么解决呢?


多亏了这些答案,我才得以修复它。我决定对这个路由使用完全限定类名,但是答案中描述了其他选项。

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

当前回答

Laravel 8文档实际上比这里的任何答案都更简洁和清楚地回答了这个问题:

路由命名空间更新

在Laravel之前的版本中,RouteServiceProvider包含一个$namespace属性。此属性的值将自动添加到控制器路由定义的前缀,并调用动作助手/ URL::action方法。在Laravel 8。X,此属性默认为空。这意味着Laravel不会自动添加名称空间前缀。因此,在新的Laravel 8。x应用程序,控制器路由定义应该使用标准的PHP可调用语法定义:

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

对动作相关方法的调用应该使用相同的可调用语法:

action([UserController::class, 'index']);

return Redirect::action([UserController::class, 'index']);

如果你喜欢Laravel 7。x风格的控制器路由前缀,你可以简单地将$namespace属性添加到应用程序的RouteServiceProvider中。

其他回答

Laravel 8文档实际上比这里的任何答案都更简洁和清楚地回答了这个问题:

路由命名空间更新

在Laravel之前的版本中,RouteServiceProvider包含一个$namespace属性。此属性的值将自动添加到控制器路由定义的前缀,并调用动作助手/ URL::action方法。在Laravel 8。X,此属性默认为空。这意味着Laravel不会自动添加名称空间前缀。因此,在新的Laravel 8。x应用程序,控制器路由定义应该使用标准的PHP可调用语法定义:

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

对动作相关方法的调用应该使用相同的可调用语法:

action([UserController::class, 'index']);

return Redirect::action([UserController::class, 'index']);

如果你喜欢Laravel 7。x风格的控制器路由前缀,你可以简单地将$namespace属性添加到应用程序的RouteServiceProvider中。

如果你喜欢这些路由的分组,你可以这样做:

Route::group(['namespace' => 'App\Http\Controllers\Api'], function () {
    Route::resource('user', 'UserController');
    Route::resource('book', 'BookController');
});

Laravel 8更新了RouteServiceProvider,它用字符串语法影响路由。你可以像之前的答案一样改变它,但推荐的方法是使用动作语法,而不是使用字符串语法的路由:

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

应改为:

Route::get('register', [RegisterController::class, 'register']);

在app/Providers文件夹中,文件RouteServiceProvider.php,将受保护的$namespace变量更改为

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

这将在保存时自动注释变量。

是的,在Laravel 8中确实发生了这个错误。 在尝试了许多解决方案后,我得到了这个完美的解决方案。 只要按照步骤做……

案例1

我们可以在api.php和web.php文件中更改如下。 目前我们编写语法的方式是

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

应该改为:

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

案例2

首先打开这个文件:app > Providers > RouteServiceProvider.php 在该文件中替换该行 Protected $namespace = null;用protected $namespace = '应用程序\Http\控制器'; 然后添加line ->命名空间($this->命名空间)如图…