验证laravel 8中相关数据更新的最佳方式



我有两种型号:

  1. 用户:
    • id
  2. 职位:
    • id
    • user_id
      • 属于User
    • 文本

我想更新Post记录,哪种方式验证user_id更好?

编号1

user_id传递给控制器,获取方法如下:

Route::post('/post/edit/{user_id}/{post_id}', 'PostController@update')->name('post.update');

并在控制器中验证:

public function update($user_id, $post_id, Request $request){
abort_if(!User::first($user_id), 404);
$request->validate([
'text' => 'string|...',
]);
Post::findOrFail($post_id)->update([
'user_id' => $user_id,
'text'    => $request->text,
]);

编号2

使用POST方法传递带隐藏字段的user_id,如:

视图:

<input type="hidden" name="user_id" value="{{ $user_id }}>

路由:

Route::post('/post/edit/{post_id}', 'PostController@update')->name('post.update');

控制器:

public function update($post_id, PostUpdate $request){
Post::findOrFail($post_id)->update([
'user_id' => $request->user_id,
'text'    => $request->text,
]);
}

PostUpdate请求:

public function rules()
{
return [
'user_id' => 'required|exists:users,id',
'text' => 'string',
];
}

哪种方式合适还是更好?

如果用户是经过身份验证的用户,请使用Auth::class

public function update($post_id, Request $request){
$request->validate([
'text' => 'string|...',
]);
Post::findOrFail($post_id)->update([
'user_id' => Auth::id(),
'text'    => $request->text,
]);
}

您甚至可以确保帖子所有者是当前用户(这更好(。

public function update($post_id, Request $request){
$request->validate([
'text' => 'string|...',
]);
Post::where('user_id', Auth::id())->findOrFail($post_id)->update([
'text'    => $request->text,
]);
}
//or (and this is the proper way to do it. It does the same amout of queries and is way easier to read/maintain).
public function update($post_id, Request $request){
$request->validate([
'text' => 'string|...',
]);
$user = Auth::user();
$post = $user->posts()->findOrFail($post_id);
$post->text = $request->text;
$post->save();
}

不需要用户验证,因为所有这些都是在登录时处理的,其余的都是通过中间件维护的。

路线:

Route::post('/post/edit/{post_id}', 'PostController@update')->middleware('auth')->name('post.update');

我为您建议了另一种方法。使用middlewares

gate中,您可以检查user的类型,因此如果他们是所有者,users应该能够进行编辑。在这种情况下,您可以只在一个文件中添加一些其他规则,并在任意位置添加用户。

app/Providers/AuthServiceProvider.php中定义您的门:

Gate::define('update-post', function ($user, AppPost $post) {
return $user->id === $post->user_id;
});

然后在你的路线web.php:

Route::get('/edit/{post}', 'PostController@edit')
->name('edit_post')
->middleware('can:update-post,post');
Route::post('/edit/{post}', 'PostController@update')
->name('update_post')
->middleware('can:update-post,post');  

最新更新