Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Validation Error customise format of the Response

I am working with L5 Form Requests and don't I just love Taylor! Well, I am doing some AJAX requests and I still want to retain my form requests. The problem is that in the case of a validation error the Validator just returns a 422 error response and flashes the errors, but my AJAX frontend expects a very specific format of response from server whether validation is successful or not.

I want to format the response on Validation errors to something like this

return json_encode(['Result'=>'ERROR','Message'=>'//i get the errors..no problem//']);

My problem is how to format the response for the form requests, especially when this is not global but done on specific form requests.

I have googled and yet not seen very helpful info. Tried this method too after digging into the Validator class.

// added this function to my Form Request (after rules())
    public function failedValidation(Validator $validator)
{
    return ['Result'=>'Error'];
}

Still no success.

like image 914
gthuo Avatar asked Jan 30 '16 02:01

gthuo


1 Answers

Currently accepted answer no longer works so i am giving an updated answer.

In the revelent FormRequest use failedValidation function to throw a custom exception

// add this at the top of your file
use Illuminate\Contracts\Validation\Validator; 
use App\Exceptions\MyValidationException;

protected function failedValidation(Validator $validator) {
    throw new MyValidationException($validator);
}

Create your custom exception in app/Exceptions

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Contracts\Validation\Validator;

class MyValidationException extends Exception {
    protected $validator;

    protected $code = 422;

    public function __construct(Validator $validator) {
        $this->validator = $validator;
    }

    public function render() {
        // return a json with desired format
        return response()->json([
            "error" => "form validation error",
            "message" => $this->validator->errors()->first()
        ], $this->code);
    }
}

This is the only way I found. If there is a better approach please leave a comment.

This works in laraval5.5, I don't think this will work in laravel5.4 but i am not sure.

like image 69
Ragas Avatar answered Oct 10 '22 12:10

Ragas