php – Laravel withValidator() not working as expected-ThrowExceptions

Exception or error:

I have this formrequest that contains rules and a withValidator as a second layer of validation.

Note: I am aware that having it unique on the rules would supress the need for this example, but I’ll need to do further validations here.

public function rules(Request $request) {
        return [
            "name"              => "required|max:191",
            "begin_date"        => "required|after_or_equal:today|date_format:d-m-Y",
            "end_date"          => "required|after:begin_date|date_format:d-m-Y",
        ];
}

public function withValidator($factory) {
        $result = User::where('name', $this->name)->get();
        if (!$result->isEmpty()) {
            $factory->errors()->add('User', 'Something wrong with this guy');
        }
        return $factory;
}

I am positive that it enters the if as I’ve placed a dd previously it to check if it’s going inside. However, it proceeds to this method on the Controller and I don’t want it to.

public function justATest(UserRequest $request) { 
       dd("HI");
}
How to solve:

I’m an idiot and didn’t read the full doc.

It needs to specify with an after function,like this:

public function withValidator($factory) {
        $result = User::where('name', $this->name)->get();
        $factory->after(function ($factory) use ($result) {
            if (!$result->isEmpty()) {
                $factory->errors()->add('User', 'Something wrong with this guy');
            }
        });
        return $factory;
}

Answer´╝Ü

I was facing this problem too.
I changed my withValidator to this:

public function withValidator($validator)
{
    if (!$validator->fails()) {
        $validator->after(function ($validator) {
            if (Cache::has($this->mobile)) {
                if (Cache::get($this->mobile) != $this->code) {
                    $validator->errors()->add('code', 'code is incorrect!');
                } else {
                    $this->user = User::where('mobile', $this->mobile)->first();
                }
            } else {
                $validator->errors()->add('code', 'code not found!');
            }
        });
    }

Leave a Reply

Your email address will not be published. Required fields are marked *