为何Laravel 7正常运行的路由在Laravel 8中报错无法使用
问题原因
Laravel 8 对路由的控制器命名空间解析逻辑做了破坏性变更:
- Laravel 7 及更早版本中,
app/Providers/RouteServiceProvider.php里默认定义了$namespace属性,值为App\Http\Controllers,框架解析路由时会自动拼接这个前缀,所以路由里直接写Auth\RegisterController就能映射到完整的App\Http\Controllers\Auth\RegisterController类 - Laravel 8 开始,默认把
RouteServiceProvider中的$namespace属性注释掉了,路由解析不会自动拼接控制器命名空间前缀,所以直接写相对命名空间的控制器类名就会抛出类不存在的错误
解决方法
有三种常用的解决方式,任选其一即可:
方式1:使用完整类名定义路由(Laravel 8+ 官方推荐写法)
先在路由文件顶部引入对应控制器,再用数组形式定义路由的控制器方法:
use App\Http\Controllers\Auth\RegisterController; Route::get('/verify', [RegisterController::class, 'verifyUser'])->name('verify.user');
方式2:直接写控制器的完整命名空间
不需要提前引入类,直接在路由中写全类名字符串即可:
Route::get('/verify', 'App\Http\Controllers\Auth\RegisterController@verifyUser')->name('verify.user');
方式3:恢复 Laravel 7 版本的自动命名空间前缀逻辑
如果需要兼容旧版本的路由写法,可修改 app/Providers/RouteServiceProvider.php,把注释掉的 $namespace 属性恢复:
// 取消下面这行的注释,或者手动添加该行 protected $namespace = 'App\Http\Controllers';
修改后不需要调整现有路由代码,原来 Laravel 7 风格的路由写法就能直接正常运行。
内容的提问来源于stack exchange,提问作者Charles Amani
相关产品推荐
相关产品推荐

