Laravel路由中如何关联模型绑定并实现归属校验返回404?
Laravel路由约束:确保Post属于对应User时才返回,否则404
下面提供几种实用的实现方式:
方法一:路由闭包内直接校验
这是最直观的方式,在路由回调里直接检查Post所属的User ID是否和路由中的User匹配,不匹配就抛出404:
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) { if ($post->user_id !== $user->id) { abort(404); } return $post; });
方法二:路由参数约束闭包
通过路由的where方法自定义参数校验逻辑,只有当Post属于当前User时才允许路由匹配:
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) { return $post; })->where('post', function ($postId, $route) { // 从路由中获取当前User,检查Post是否属于该User return Post::where('id', $postId) ->where('user_id', $route->parameter('user')->id) ->exists(); });
方法三:重写模型的路由绑定方法
在Post模型里自定义路由绑定逻辑,自动关联当前路由中的User进行校验:
// app/Models/Post.php public function resolveRouteBinding($value, $field = null) { // 获取路由中的User参数 $currentUser = request()->route('user'); if ($currentUser) { // 只返回属于该User的Post,否则抛出404 return $this->where('id', $value) ->where('user_id', $currentUser->id) ->firstOrFail(); } // 如果路由中没有User参数,走默认绑定逻辑 return parent::resolveRouteBinding($value, $field); }
只要路由里同时存在user和post参数,就会自动校验所属关系。
方法四:利用路由模型绑定的作用域(Laravel 8+)
这是最简洁的方式,前提是User模型已经定义了和Post的关联关系:
// app/Models/User.php public function posts() { return $this->hasMany(Post::class); }
然后在路由上添加scopeBindings()方法,Laravel会自动利用关联关系约束Post必须属于当前User:
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) { return $post; })->scopeBindings();
内容的提问来源于stack exchange,提问作者ThunderBirdsX3
相关产品推荐
相关产品推荐

