Solución:
Debe asegurarse de enviar la solicitud con el Accept: application/json
encabezamiento.
Sin eso, Laravel no detectará que es una solicitud de API y no generará la respuesta 422 con errores.
La forma correcta de mostrar errores de validación utilizando inyectado FormRequest
el objeto es anular failedValidation
.
Como se indicó anteriormente en la sección de comentarios, inyectado FormRequest
El objeto valida la solicitud por sí mismo, no es necesario validarla por segunda vez en el cuerpo del controlador (ese es uno de los principales beneficios). Si la validación falla, no presionará el cuerpo del controlador de todos modos.
Crea una clase abstracta que se extienda FormRequest
y anular failedValidation
.
<?php
namespace AppHttpRequests;
use IlluminateContractsValidationValidator;
use IlluminateFoundationHttpFormRequest;
use IlluminateHttpExceptionsHttpResponseException;
use IlluminateHttpResponse;
abstract class BaseFormRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
abstract public function rules(): array;
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
abstract public function authorize(): bool;
/**
* Handle a failed validation attempt.
*
* @param Validator $validator
*
* @return void
*/
protected function failedValidation(Validator $validator): void
{
$errors = $validator->errors();
throw new HttpResponseException(response()->json([
'errors' => $errors
], Response::HTTP_UNPROCESSABLE_ENTITY));
}
}
Ahora puedes extender BaseFormRequest
en todas sus API, solicite clases de validación. Los errores de validación ahora se mostrarán como un mensaje codificado JSON con un código HTTP de entidad no procesable (422).
Fuente: https://medium.com/@Sirolad/laravel-5-5-api-form-request-validation-errors-d49a85cd29f2