使用 Laravel 8 时出现“目标类控制器不存在”的错误。
使用 Laravel 8 时出现“目标类控制器不存在”的错误。
这是我的控制器:
我的api.php
路由:
[apcode language="php"]
Route::get('register', 'Api\RegisterController@register');
当我使用Postman命中我的register
路由时,它给我返回了以下错误:
目标类[Api\\RegisterController]不存在。
我该如何修复它?
幸好有了答案,我成功地解决了这个问题。我决定对此路由使用完全限定的类名,但通过 answers 描述的其他选项也可以实现。
Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');
- 是的,在Laravel 8中会出现这个错误。
- 尝试了很多解决方案后,我找到了这个完美的解决方案。
- 只需按照以下步骤操作...
情况1
我们可以在api.php
和web.php
文件中进行如下更改。
当前我们编写syntax
的方式是
Route::get('login', 'LoginController@login');
应该更改为:
Route::get('login', [LoginController::class, 'login']);
情况2
-
首先进入文件:
app > Providers > RouteServiceProvider.php
-
在该文件中,将行
protected $namespace = null;
替换为protected $namespace = 'App\Http\Controllers';
-
然后像图片中展示的那样添加
->namespace($this->namespace)
...
您正在使用 Laravel 8。在 Laravel 8 的新安装中,您的路由组没有应用命名空间前缀,用于加载路由。
“在 Laravel 的以往版本中,
RouteServiceProvider
包含一个$namespace
属性。这个属性的值会自动添加到控制器路由定义和对action
助手/URL::action
方法的调用中。在 Laravel 8.x 中,此属性默认为null
。这意味着 Laravel 不会自动添加命名空间前缀。”Laravel 8.x Docs - Release Notes
如果不使用命名空间前缀,您必须在路由中引用完全限定类名(Fully Qualified Class Name),以指定控制器。
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
属性:
尽管在发布说明中和您的 RouteServiceProvider
中有提到要设置 $namespace
属性,但这对您的路由没有任何影响。它目前仅用于为生成操作的 URL 添加命名空间前缀。因此,您可以设置此变量,但它本身不会添加这些命名空间前缀,您仍然必须确保在添加命名空间前缀到路由组时使用此变量。
这个信息现在已经在升级指南中了
根据升级指南所示,重要的是你要在路由群组中定义一个命名空间。仅仅设置$namespace
变量只有在生成操作的 URL 时有帮助,而不会真正给路由分组设置命名空间。
再次强调,重要的是设置路由群组的命名空间,实际上在示例中是通过直接引用成员变量$namespace
来设置的。
更新:
如果你已经安装了 Laravel 8 的新版本(8.0.2 之后的版本),你可以取消注释 RouteServiceProvider
中的 protected $namespace
成员变量以回到旧的方法,因为路由分组已经设置为使用这个变量作为群组的命名空间。
// protected $namespace = 'App\\Http\\Controllers';
只有取消注释该变量才能将命名空间前缀添加到分配给路由的控制器中,因为路由群组已经设置为使用这个变量作为群组的命名空间:
... ->namespace($this->namespace) ...