[英]Best way to validate related data update in laravel 8
我有两个模型:
User
我想更新一条Post记录,哪种验证user_id的方式比较好?
使用 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,
]);
使用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.