如何在验证失败和通过验证时在 laravel 验证中创建回调?

How to create a callback in laravel validation when it failed-validated and passed-validated?

我的自定义请求文件中有一个验证。

class AuthRequest extends FormRequest
{
    public function store()
    {
        return $this->validate([
            'first_name' => ['required','min:2','max:30',new PersonNameRule],
            'last_name' => ['required','min:2','max:30',new PersonNameRule],
            'username' => ['required','confirmed',new UsernameRule]
        ]);
    }

    public function rules(){ return []; }
}

在我的控制器中,它是这样使用的。

public function store(AuthRequest $request)
{
    $data = $request->store();

    return request()->all();
}

我的问题是如何执行以下操作:

您可以使用 Validator 实例而不是调用 validate()

    $validator = Validator::make($request->all(), [
         'first_name' => ['required','min:2','max:30',new PersonNameRule],
         'last_name' => ['required','min:2','max:30',new PersonNameRule],
         'username' => ['required','confirmed',new UsernameRule]
    ]);

    if ($validator->fails()) {
        // create a session
    } else {
        // destroy the session
    }

您可以在此处的文档中查看更多信息:https://laravel.com/docs/7.x/validation#manually-creating-validators

首先我会将您的验证转换为表单请求,这将在注入控制器时自动解析。

UserCreateRequest extends FormRequest {
    public function rules() {
        'first_name' => ['required','min:2','max:30',new PersonNameRule],
        'last_name' => ['required','min:2','max:30',new PersonNameRule],
        'username' => ['required','confirmed',new UsernameRule]
    }
}

要使用它,请像这样注入它。

public create(UserCreateRequest $request) {
    ...
}

您可以在表单请求中使用两种回调方法 passedValidation()failedValidation()

protected function failedValidation(Validator $validator) {
    session(['attempt' => session('attempt')+1 ?? 1]);

    return parent::failedValidation($validator);
}

protected function passedValidation() {
    session()->forget('attempt')

    return parent::passedValidation();
}

@mrhn是对的,你没有在函数里面填规则,所以FormRequest总是returnfalse。相反,您更喜欢创建自己的方法并使用 $this->validate()

下面是解决问题的方法,在文件 ..\Illuminate\Validation\Validator.php 中找到 validate() 函数,然后将它们放入您想要执行的会话,如下所示。

public function validate()
{
    if ($this->fails()) {
        session(['attempt' => session('attempt')+1 ?? 1]);
        throw new ValidationException($this);
    }else{
        session()->forget('attempt');
    }

    return $this->validated();
}

The solution above is global which means it will perform everytime you use $this->validate().