php - 在 laravel 8 中验证相关数据更新的最佳方法
问题描述
我有两个模型:
- 用户:
- ID
- 邮政:
- 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',
];
}
哪种方式合适或更好?
解决方案
如果用户是经过身份验证的用户,请使用 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');
推荐阅读
- typescript - 关于 TypeScript 互斥类型的几个问题
- c# - DateTimeFormatInfo.DayNames 在 Android 上返回额外的、空的、日期名称
- sql - 在mysql中的第m行之后获取第n行
- angular - 在 Angular 中动态附加翻译文本
- javascript - 如何使输入字段的高度响应内容?
- azure - 使用 Azure CDN 的 HTTP 到 HTTPS
- docker - 如何在 kubernetes 中部署 npm run build 的 dist 文件夹?
- javascript - 如何在 JavaScript 中显示多个随机整数?
- javascript - 如何在第一次渲染后模拟 select onchange
- amazon-web-services - 如何将docker ip地址映射到域名