senty
senty

Reputation: 12847

Laravel 5 Validation - Return as json / ajax

I am trying to post the values into validation and return the response as json rather than return view as given in the documentation.

$validator = Validator::make($request->all(), [
    'about' => 'min:1'
]);

if ($validator->fails()) {
    return response()->json(['errors' => ?, 'status' => 400], 200);
} 

The post is made by ajax so I need to receive the response in the ajax as well.

I figured out that in order to prevent refresh of the page in the returning response, I have to give it a status code of 200 outside the array. But I couldn't figure out what to give the 'errors' part. What should I write in there?

Upvotes: 36

Views: 77892

Answers (8)

Zymawy
Zymawy

Reputation: 1626

in case you are using a request class.

you may use failedValidation to handle you failed

/**
* Returns validations errors.
*
* @param Validator $validator
* @throws  HttpResponseException
*/
protected function failedValidation(Validator $validator)
{
    if ($this->wantsJson() || $this->ajax()) {
        throw new HttpResponseException(response()->json($validator->errors(), 422));
    }
    parent::failedValidation($validator);
}

Upvotes: 3

Mohammad H.
Mohammad H.

Reputation: 1046

Actually I used @Soura solution but with a little change. You need to import the Validator package as well.

$validator = \Validator::make($request->all(), [ 
    'ride_id' => 'required',
    'rider_rating' => 'required',
]);
    
if ($validator->fails()) {
    return response()->json($validator->errors(), 400);
}

Upvotes: 1

Peyman.H
Peyman.H

Reputation: 1952

You can use $validator->messages() that returns an array which contains all the information about the validator, including errors. The json function takes the array and encodes it as a json string.

if ($validator->fails()) {    
    return response()->json($validator->messages(), Response::HTTP_BAD_REQUEST);
}

Note: In case of validation errors, It's better not to return response code 200. You can use other status codes like 400 or Response::HTTP_BAD_REQUEST

Upvotes: 46

James Mills
James Mills

Reputation: 554

My solution is to make my own FormRequest class which I put in the root API namespace namespace App\Http\Requests\Api.

Hope this helps someone

https://jamesmills.co.uk/2019/06/05/how-to-return-json-from-laravel-form-request-validation-errors/

Upvotes: 1

Gjaa
Gjaa

Reputation: 1580

You can also tell Laravel you want a JSON response. Add this header to your request:

'Accept: application/json'

And Laravel will return a JSON response.

Upvotes: 23

Soura Ghosh
Soura Ghosh

Reputation: 917

I use below this code for API in my existing project.

$validator = Validator::make($request->all(), [ 
      'ride_id' => 'required',
      'rider_rating' => 'required',
  ]);

  if ($validator->fails()) {
    return response()->json($validator->errors(), 400);
  }

Upvotes: 2

minhazur
minhazur

Reputation: 4988

For those who have created a custom request class can override the public function response(array $errors) method and return a modified response without Validator explicitly.

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\JsonResponse;

class CustomRequest extends FormRequest
{

    public function rules()
    {
        $rules = [
            //custom rules    
        ];

        return $rules;
    }

    public function response(array $errors)
    {
        return new JsonResponse(['error' => $errors], 400);
    }
}

Upvotes: 2

Jones03
Jones03

Reputation: 1257

In Laravel 5.4 the validate() method can automatically detect if your request is an AJAX request, and send the validator response accordingly.

See the documentation here

If validation fails, a redirect response will be generated to send the user back to their previous location. The errors will also be flashed to the session so they are available for display. If the request was an AJAX request, a HTTP response with a 422 status code will be returned to the user including a JSON representation of the validation errors.

So you could simply do the following:

Validator::make($request->all(), [
    'about' => 'min:1'
])->validate();

Upvotes: 10

Related Questions