繁体   English   中英

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

[英]Best way to validate related data update in laravel 8

我有两个模型:

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

我想更新一条Post记录,哪种验证user_id的方式比较好?

1号

使用 get 方法将user_id传递给 controller,例如:

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

并在 controller 中验证:

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');

Controller:

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

哪种方式合适或更好?

如果用户是认证用户,使用 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();
}

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

路线:

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, \App\Post $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');  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM