Estoy usando Laravel 5.4. Tengo una clase de solicitud de formulario personalizado donde tengo mis reglas y mensajes de validación y lo uso en mi controlador de la siguiente manera:
public function store(CustomFormRequest $request) { // }Estoy usando ajax para enviar la solicitud y cuando hay algún error de validación, Laravel arroja un error con una respuesta HTTP con un código de estado 422 que incluye una representación JSON de los errores de validación.
Pero no quiero eso. En cambio, dentro del método de mi controlador, quiero averiguar si hay algún error de validación y, si lo hay, quiero devolver una respuesta con algunos datos adicionales junto con los mensajes de validación, como este:
// Inside my Controller public function store(CustomFormRequest $request) { if ($validator->fails()) { $errors = $validator->errors(); return response()->json(array('status' => 2, 'msg' => $errors->all() )); } }Podrias ayudarme por favor ? Gracias por adelantado.
La forma más fácil de hacer esto sería anular el método de response() para la clase de solicitud de formulario.
Para hacer esto, simplemente puede agregar algo como lo siguiente a su clase:
import Illuminate\Http\JsonResponse
public function response(array $errors) { if ($this->expectsJson()) { return new JsonResponse(['status' => 2, 'msg' => $errors], 422); } return parent::response($errors); }No olvide importar Illuminate\Http\JsonResponse
¡Espero que esto ayude!
Sé que desea la lógica en su controlador, pero aún puede aprovechar su archivo de solicitud para esto. En la documentación de Laravel (suponiendo que esté utilizando la última versión) se describe comoAgregar enlaces posteriores a las solicitudes de formulario :
Si desea agregar un gancho "después" a una solicitud de formulario, puede usar el método withValidator. Este método recibe el validador completamente construido, lo que le permite llamar a cualquiera de sus métodos antes de que se evalúen realmente las reglas de validación:
/** * Configure the validator instance. * * @param \Illuminate\Validation\Validator $validator * @return void */ public function withValidator($validator) { $validator->after(function ($validator) { if ($this->somethingElseIsInvalid()) { $validator->errors()->add('field', 'Something is wrong with this field!'); } }); }prueba esto:
form.ajaxSubmit({ async: false, type: yourMethod, url: yourRoute, headers: { 'X-CSRF-TOKEN': "{{csrf_token()}}" }, dataType: 'json', success: function(data){ location.href = data.redirect_to; }, error: function(data) { var errors = data.responseJSON; var errorsArr = []; for (error in errors) { errorsArr.push(errors[error]); } errorsArr = $.map(errorsArr, function(n){ return n; }); alert("<strong class='text-danger'>" + errorsArr.join("<br>") + "</strong>"); console.log(errors); } });y en el método de almacenamiento de su controlador, haga return:
return response()->json(['redirect_to' => '/your_route']);