我有两种型号:
- 用户:
- id
- 职位:
- 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');