首页 > 解决方案 > 在 laravel 8 中验证相关数据更新的最佳方法

问题描述

我有两个模型:

  1. 用户:
    • ID
  2. 邮政:
    • ID
    • 用户身份
      • 属于User
    • 文本

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

1号

user_id使用 get 方法传递给控制器​​,例如:

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号

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

看法:

<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,
   ]);
}

更新后请求:

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

哪种方式合适或更好?

标签: phplaravelvalidationlaravel-8

解决方案


如果用户是经过身份验证的用户,请使用 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');

推荐阅读