简体   繁体   中英

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

I have here a validation in my custom request file.

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 []; }
}

In my controller, this is how use it.

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

    return request()->all();
}

My question is how can I do these things below:

  • when validation failed - create a session / session(['attempt' => session('attempt')+1?? 1]);
  • when validation passed - destroy the session / session()->forget('attempt')

You can use Validator instance instead of calling 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
    }

You can see more in the doc here: https://laravel.com/docs/7.x/validation#manually-creating-validators

@mrhn is right you did not fill the rules inside the function, so the FormRequest will always return false. What you did instead, you prefer to create your own method(s) and by using the $this->validate() .

Now here's how to achieve your problem, in file ..\Illuminate\Validation\Validator.php find the validate() function, and put those session you desired to perform, like these below.

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() .

Firstly i will convert your validation to a form request, this will automatically resolve when injected into a controller.

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]
    }
}

To use it inject it like so.

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

Here you can utilize two callback methods passedValidation() and failedValidation() , in your form request.

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

    return parent::failedValidation($validator);
}

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

    return parent::passedValidation();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM