0

在 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', 
        ];
    }

}

如何更改上述验证规则集,以说明传入输入仅在现有记录的状态设置为“待处理”时才有效。即不允许拒绝邀请,除非现有待处理。

选项 1: 将此逻辑放入控制器中。也许上述内容不被视为验证的一部分(尽管我认为它是),因此不属于 FormRequest。

方案二: 将逻辑放在FormRequest方法的Authorize方法中。唯一的缺点是授权应该用于访问控制,而不是数据验证。

选项 3: 扩展表单请求以包含验证现有数据和传入数据的第三种方法。有点痛苦,因为我需要确保它作为请求周期的一部分被调用。

选项 4: 添加自定义验证规则: http: //laravel.com/docs/5.0/validation#custom-validation-rules

4

1 回答 1

1

您可以添加到您的自定义InviteDeclineRequest类方法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

于 2015-04-18T08:00:12.443 回答