Laravel7升级至Laravel8后同路径GET/POST路由报错无结构改动修复问询
问题根源
Laravel 8 对路由注册语法做了两处调整,和你现有代码冲突:
- 取消了路由的
uses参数对[控制器类::class, 方法名]数组格式的支持,uses仅接受控制器全类名@方法名格式的字符串,你现有部分POST路由用数组传值给uses就是直接报错的原因 - 默认关闭了路由命名空间自动前缀,不再自动给控制器类补
App\Http\Controllers\前缀
解决方案(仅修改路由文件,无需改动其他业务代码)
你只需要把所有符合以下旧写法的POST路由:
Route::post('/profile-settings', ['as' => 'profile-settings','uses'=> [App\Http\Controllers\ProfileController::class, 'update_profile']]);
统一替换为Laravel 8支持的写法即可,两种写法二选一:
写法1(Laravel 8 官方推荐,优先选)
Route::post('/profile-settings', [App\Http\Controllers\ProfileController::class, 'update_profile'])->name('profile-settings');
写法2(保留原有as/uses结构,无需调整参数顺序)
Route::post('/profile-settings', ['as' => 'profile-settings', 'uses' => 'App\Http\Controllers\ProfileController@update_profile']);
批量修改技巧
你有近50处同类路由,可以用编辑器的正则替换批量处理,1分钟就能改完:
- 搜索正则:
Route::post\('([^']+)',\s*\['as'\s*=>\s*'([^']+)',\s*'uses'\s*=>\s*\[([^,]+),\s*'([^']+)'\]\]\) - 替换内容:
Route::post('$1', [$3, '$4'])->name('$2')
补充说明
你现有代码里同一资源的GET/POST路由重名是合法的,Laravel匹配路由时会同时校验请求方法+URI,不会冲突,原业务代码里的route()调用、表单提交逻辑完全不需要修改。
内容的提问来源于stack exchange,提问作者MsCrelix
相关产品推荐
相关产品推荐

