更新行时,如何验证现有行是否包含具有 Laravel 表单请求的值?
When updating a row, how do I validate that the existing row contains a value with Laravel form requests?
在Laravel 5中,使用表单请求作为验证门,并给出以下代码:
控制器
public function decline(Request $request, InviteDeclineRequest $validation, $id)
{
$invite = Invite::find($id);
$invite->status = 'declined';
$invite->save();
}
表单请求
class InviteDeclineRequest extends Request {
public function rules()
{
return [
# this is referring to the incoming data,
# not the existing data
'status': 'pending',
];
}
}
我如何更改上面的验证规则集,即仅当现有记录的状态设置为 'pending' 时传入输入才有效。即不允许拒绝邀请,除非现有的邀请处于待定状态。
选项 1:
将此逻辑放入控制器中。也许以上内容不被视为验证的一部分(尽管我认为它是),因此不属于 FormRequest。
选项 2:
将逻辑放在 FormRequest 方法的 Authorize 方法中。唯一的缺点是授权应该用于访问控制,而不是数据验证。
选项 3:
扩展表单请求以包括第三种方法来验证现有数据和传入数据。有点痛苦,因为我需要确保它作为请求周期的一部分被调用。
选项 4:
添加自定义验证规则:
http://laravel.com/docs/5.0/validation#custom-validation-rules
您可以添加到您的自定义 InviteDeclineRequest
class 方法 all
以将 id
添加到将要验证的数据:
public function all()
{
$data = parent::all();
$segments = $this->segments();
$id = intval(end($segments));
if ($id != 0) {
$data['id'] = $id;
}
return $data;
}
现在 rules
您可以使用它:
public function rules()
{
return [
'id' => ['required', 'exists:invites,id,status,pending']
];
}
确保您编辑的记录具有状态 pending
。
在Laravel 5中,使用表单请求作为验证门,并给出以下代码:
控制器
public function decline(Request $request, InviteDeclineRequest $validation, $id)
{
$invite = Invite::find($id);
$invite->status = 'declined';
$invite->save();
}
表单请求
class InviteDeclineRequest extends Request {
public function rules()
{
return [
# this is referring to the incoming data,
# not the existing data
'status': 'pending',
];
}
}
我如何更改上面的验证规则集,即仅当现有记录的状态设置为 'pending' 时传入输入才有效。即不允许拒绝邀请,除非现有的邀请处于待定状态。
选项 1: 将此逻辑放入控制器中。也许以上内容不被视为验证的一部分(尽管我认为它是),因此不属于 FormRequest。
选项 2: 将逻辑放在 FormRequest 方法的 Authorize 方法中。唯一的缺点是授权应该用于访问控制,而不是数据验证。
选项 3: 扩展表单请求以包括第三种方法来验证现有数据和传入数据。有点痛苦,因为我需要确保它作为请求周期的一部分被调用。
选项 4: 添加自定义验证规则: http://laravel.com/docs/5.0/validation#custom-validation-rules
您可以添加到您的自定义 InviteDeclineRequest
class 方法 all
以将 id
添加到将要验证的数据:
public function all()
{
$data = parent::all();
$segments = $this->segments();
$id = intval(end($segments));
if ($id != 0) {
$data['id'] = $id;
}
return $data;
}
现在 rules
您可以使用它:
public function rules()
{
return [
'id' => ['required', 'exists:invites,id,status,pending']
];
}
确保您编辑的记录具有状态 pending
。