Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/02/2015, 09:25
nh2006
 
Fecha de Ingreso: diciembre-2006
Mensajes: 213
Antigüedad: 17 años, 4 meses
Puntos: 3
Validación mediante FormRequest y ajax Laravel 5

Hola amigos,

Quiero hacer la validación de campos en Laravel 5 utilizando FormRequest pero ocupando ajax, normalmente solo con FormRequest los errores se muestran en el formulario recorriendo el array $errors mediante un foreach pero lo que quiero hacer es que mediante ajax me liste en un mensaje los errores del formulario o sino hay errores me muestre un mensaje indicando que la operación se realizó con éxito en el mismo formulario, sin necesidad de recargar todo el formulario o enviar a otra página. Estos mensajes se mostraría en un div con class="alert alert-danger" o div="alert alert-success"


He trabajado lo siguiente:

En rutas tengo:

Código PHP:
Ver original
  1. Route::post('proceso/registrar','ProcesoController@registrar');

En la vista tengo:

Código PHP:
Ver original
  1. <!-- El formulario -->
  2. <div class="col-xs-offset-2 col-xs-10" id="mensajes">
  3.                  
  4. </div>
  5.  
  6. <!-- resto de la vista -->

En el div anterior se van a mostrar los mensajes de error en un "alert alert-danger" o el mensaje de éxito "alert alert-success"

Mi FormRequest esta así:

Código PHP:
Ver original
  1. <?php namespace App\Http\Requests;
  2.  
  3. use App\Http\Requests\Request;
  4.  
  5. class ProcesoFormRequest extends Request {
  6.  
  7.     public function authorize()
  8.     {
  9.         return true;
  10.     }
  11.  
  12.     public function rules()
  13.     {
  14.         return [
  15.             'dato'=>'required'
  16.         ];
  17.     }
  18.    
  19.     public function response(array $errors)
  20.     {
  21.         if ($this->ajax() || $this->wantsJson())
  22.         {
  23.             return new JsonResponse($errors, 422);
  24.         }
  25.         return $this->redirector->to($this->getRedirectUrl())
  26.                                         ->withInput($this->except($this->dontFlash))
  27.                                         ->withErrors($errors, $this->errorBag);
  28.     }
  29. }

El método en mi controlador esta así:

Código PHP:
Ver original
  1. <!-- resto del controlador -->
  2. public function registrar(ProcesoFormRequest $request)
  3.     {
  4.         if (count($request->errors)==0)    {
  5.             $input=$request->get('dato');
  6.             return '1';
  7.         }else{
  8.             return '2';
  9.         }                  
  10.     }


Nota: Este método lo he simplificado bastante retornando 1 en caso de éxito o 2 en caso de error, la idea al final es armar un string con todos los errores y devolverlos en lugar del 2.

En la vista tengo el método ajax así:

Código Javascript:
Ver original
  1. $("#formulario").submit(function(e)
  2.             {                
  3.                 var postData = $(this).serialize();
  4.                 var formURL = $(this).attr("action");                                      
  5.                 $.ajax(
  6.                 {
  7.                     url : formURL,
  8.                     type: "POST",
  9.                     data : postData,
  10.                     success:function(data, textStatus, jqXHR)
  11.                     {                        
  12.                         alert(data);
  13.                     },
  14.                     error: function(jqXHR, textStatus, errorThrown)
  15.                     {
  16.                         alert(errorThrown);  
  17.                     }
  18.                 });
  19.                e.preventDefault();
  20.             });

Volviendo al tema, el punto es que hago el envío desde la vista llenando el campo del formulario sí me devuelve 1, pero si lo dejo en blanco me devuelve el error 500 "Internal Server Error"

Me pueden orientar por favor? La idea es que al caso de haber éxito muestre el respectivo mensaje y sino muestre los errores pero en el mismo formulario dentro del div con id="mensajes", sin tener que recargarlo todo o enviarlo a otra página, a mí solo se me ocurre ajax.

Gracias desde ya por su ayuda