为什么我的 Laravel 路由在 Laravel 7 中有效,但在 Laravel 8 中无效?

问题描述

这是我在 laravel 7 中运行良好的路线:

Route::get('/verify','Auth\RegisterController@verifyUser')->name('verify.user'); 

但是在 Laravel 8 中它不起作用。它显示一个错误

Illuminate\Contracts\Container\BindingResolutionEx. Target class [Auth\RegisterController] does not exist.

解决方法

在 Laravel 8 中,您的 RouteServiceProvider 中应用程序的控制器命名空间默认是注释的:

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

根据文档:

在以前的 Laravel 版本中,RouteServiceProvider 包含一个 $namespace 属性。此属性的值将自动添加到控制器路由定义和对操作助手 / URL::action 方法的调用的前缀。在 Laravel 8.x 中,这个属性默认为 null。这意味着 Laravel 不会自动添加命名空间前缀。”Laravel 8.x Docs - Routing Namespace Updates

您可以像这样导入命名空间:

use App\Http\Controllers\Auth\RegisterController;

// then
Route::get('/verify','RegisterController@verifyUser')->name('verify.user');

或者您可以使用完全限定的名称,如下所示:

Route::get('/verify',[App\Http\Controllers\Auth\RegisterController::class,'verifyUser'])->name('verify.user');

// or 
Route::get('/verify','App\Http\Controllers\Auth\RegisterController@verifyUser')->name('verify.user');;
,

以下是laravel 8 中定义路由的新方法

Route::get('/verify',[Auth\RegisterController::class,'verifyUser'])->name('verify.user');