Laravel 5.5.* has made a change which is big deal with Laravel developers now a days and the change is you can't customize your validation error response like you you did in earlier versions. In earlier versions of Laravel we were able to customize or change our validation error response with below function example:
1
2
3
4
5
6
7
8
9
10
11
12
|
public function response(array $errors) {
$first_error = '';
foreach ($errors as $error) {
$first_error = $error[0];
break;
}
$this->response['result'] = array();
$this->response['message'] = $first_error;
$this->response['status'] = 0;
return \Illuminate\Support\Facades\Response::json($this->response, Response::HTTP_BAD_REQUEST)->header('Content-Type', "application/json");
}
|
Now in current versions of Laravel 5.5.* you will not be able to customize your validation error response with this function.
You will require to use followings as well:
1
2
|
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
|
If you are using FormRequests to validate data and want to return custom JSON on error response in Laravel 5.5.*, You have to you below function.
1
2
3
|
protected function failedValidation(Validator $validator) {
throw new HttpResponseException(response()->json($validator->errors(), 422));
}
|
It will return all the validation error in JSON.
Now if you still wanted to customize this error response you can so it very easily like below example:
1
2
3
4
5
6
7
8
|
protected function failedValidation(Validator $validator) {
$response = [];
$response['data'] = [];
$response['status'] = 0;
$response['message'] = trans('messages.validation_errors');
$response['errors'] = $validator->errors();
throw new HttpResponseException(response()->json($response, 422));
}
|
So the final validation request looks like:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
class RegisterRequest extends FormRequest {
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules() {
return [
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|max:25',
'role_type' => 'required|in:2,3',
'device_id' => 'required',
'device_type' => 'required|in:1,2',
'device_token' => 'sometimes'
];
}
/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
return [
'name.required' => 'You first name and last name combination is required'
];
}
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize() {
return true;
}
protected function failedValidation(Validator $validator) {
$response = [];
$response['data'] = [];
$response['status'] = 0;
$response['message'] = trans('message.validation_errors');
$response['errors'] = $validator->errors();
throw new HttpResponseException(response()->json($response, 422));
}
}
|
Apart from this because you can have multiple validation requests in your project so I will suggest you to keep failedValidation() function in some parent class and then extend your validation class like below example.
1
2
3
4
5
6
7
|
<?php
namespace App\Http\Requests;
class RegisterRequest extends BaseApiRequest {
// your validation rules and autorize() function comes here..
}
|
And below is is the parent class example like BaseApiRequest.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
/**
* This class is base class for all API request
* @author Saurabh
*/
class BaseApiRequest extends FormRequest {
protected function failedValidation(Validator $validator) {
$response = [];
$response['data'] = [];
$response['status'] = 0;
$response['message'] = trans('messages.validation_errors');
$response['errors'] = $validator->errors();
throw new HttpResponseException(response()->json($response, 422));
}
}
|