Laravel9新增所有权变更路由报错:Route [blogs.change_ownership]未定义
Laravel 9路由错误解决:Route [blogs.change_ownership]未定义
错误核心原因:视图中调用的路由名称blogs.change_ownership与web.php里定义的路由名称不匹配,且两个路由共用了同一个名称,导致路由识别混乱。
修正后的完整代码如下:
1. web.php(路由配置)
给两个路由设置唯一且符合Laravel规范的名称,同时调整路径更贴合REST风格:
// 显示所有权变更编辑页面(GET请求) Route::get('/blogs/{blog}/change-ownership', [BlogController::class, 'change_ownership'])->name('blogs.change_ownership'); // 处理所有权更新操作(推荐用PUT/PATCH,符合REST更新资源的规范) Route::put('/blogs/{blog}/change-ownership', [BlogController::class, 'update_ownership'])->name('blogs.update_ownership');
若坚持使用POST方法,将
put替换为post即可,但PUT/PATCH更符合Laravel最佳实践。
2. pool.blade.php(视图跳转链接)
你的原代码路由名称已匹配修正后的路由,无需修改:
<td><a href="{{route('blogs.change_ownership', $blog->id)}}">{{$blog->id}}_I will change ownership</a></td>
3. 控制器代码(优化建议)
原功能逻辑正常,可添加请求验证增强健壮性,同时修正拼写错误(sucessfully→successfully):
use Illuminate\Support\Facades\Validator; public function change_ownership(Blog $blog) { return view('blogs.change_ownership', compact('blog')); } public function update_ownership(Request $request, Blog $blog) { // 验证请求参数合法性 $validator = Validator::make($request->all(), [ 'br_name' => 'required|string', ]); if ($validator->fails()) { return back()->withErrors($validator)->withInput(); } $blog->br_name = $request->br_name; $blog->save(); return redirect(route('blogs.index'))->with('status', 'ownership_changed_successfully'); }
若使用PUT/PATCH方法,需在变更页面的表单中添加
@method('PUT')指令:
<form action="{{ route('blogs.update_ownership', $blog->id) }}" method="POST"> @csrf @method('PUT') <!-- 表单输入字段 --> </form>
关键注意事项
- 路由名称必须全局唯一,不可重复定义
- 路由名称建议遵循
资源名.操作名的格式(如blogs.change_ownership),贴合Laravel命名习惯 - 使用
route()辅助函数时,传入的名称必须与路由定义的->name()参数完全一致
内容的提问来源于stack exchange,提问作者bluetail
相关产品推荐
相关产品推荐

