更新行时,如何验证现有行是否包含具有 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