La mejor forma de manejar las Validaciones en Laravel: Form Request ⚔

¿Qué son, cómo y por que utilizar los Form Request?

Deja una respuesta

Comment as a guest.

  1. Podrías decirme cómo hacer un Form Request para la actualización de un recurso que tenga un email como índice único en sus propiedades, ya he tenido muchos inconvenientes con ese detalle

    1. Hola Henry, discúlpame por la demora en responder, pero estuve de vacaciones totalmente desconectado. Según entiendo, quieres hacer un Form Request para un formulario que actualiza datos no? Si es así, deberias tener las reglas algo así:


      return [
      'user.name.first' => 'required',
      'user.name.last' => 'required',
      'user.email' => 'required|email|unique:users,email,'.$user->id,
      ];

      Mira como definí la regla para el email, para que así no de error por «emial único» cuando es el mismo usuario el que esta queriendo actualizar sus propios datos.

      Espero que te sirva.
      Saludos.

      1. Buenas Matias, excelente tu respuesta de hecho me sirvió para un proyecto. Sin embargo, en otro proyecto la tablas están en diferentes esquemas dentro de una misma BD postgres y al colocar el nombre del esquema y tabla Laravel me da error que la conexión no existe. Tienes alguna alternativa de resolver esta escenario?, gracias de antemano

        1. Hola Dennys, si mal no recuerdo, no tenes que poner el nombre del esquema, sino el nombre del driver que configuraste en config/database.php para ese esquema.
          También, si estas utilizando Laravel 6.x (o superior), y en el modelo tenes configurado la conexión a donde debe consultar, tenes la posibilidad de utilizar el modelo en la regla, así por ejemplo: 'email' => 'unique:App\User'

  2. Hola quiero usar form request en mi api, tengo el método store, ya cree mi form request y si valida, pero al fallar quiere regresar un redirect, y yo solo quiero que me regrese los errores para devolverlos en el response de mi API.

  3. Excelente me pareció el Artículo, El caso o la duda es el siguiente: mi código proviene de una ruta llamada ‘users.create’ la cual retorna a una vista ‘users.create.php’, el cual es un formulario que captura los datos. Por defecto Laravel redirecciona a esta vista y no se me muestra nada en el navegador. tuve que redireccionar según lo que aprendí en tu buen artículo a otra ruta ‘users.index’, que no es la que yo quiero, pero ni modo, funciona pero, seguiré leyendo a ver como soluciono.

  4. Amigos actualmente estoy montando un Validador con request, que lee en una tabla los privilegios de los usuarios para dejarlos acceder a los recursos de la administración, más temprano que tarde se los comparto para que les saquen el debido provecho.

    1. Tenes razón, fue mi error. Lo ideal es [Acción][Modelo]Request. Muchas gracias por tu comentario y la observación. Saludos.

  5. Me ha ayudado mucho este tutorial. Muchas gracias.
    Solo que me ha surgido una duda, ¿Se le puede pasar un parámetro al form request? Lo que pretendo es hacer un form request y una regla de validación para impedir que use la misma contraseña que uso con anterioridad a la hora de una actualización de la misma.

    1. Hola Uriel, como estas? Tene en cuenta que en el FormRequest tendrías acceso al usuario logueado (con auth()->user()). De esta forma podrías obtener sus contraseñas antiguas.
      Por otro lado, también tienes acceso a los datos que se esta validando. Para acceder a ellos tenes que usar $this->nombre-del-campo.

      Espero que te sirva mi respuesta, si no volve a comentar con mas detalles. Saludos bro.

      1. Estoy de maravilla, gracias por preguntar, ¿Tú, cómo estás?
        ¡Excelente! Me funciono tu respuesta, gracias por ver algo que «era obvio» y no lo vi 😅
        Solo una duda, ¿Si es la mejor practica hacerlo de esa manera? Lo digo mas que nada por los principios SOLID. Saludos 😀

        1. Muy bien, gracias.
          Si, para respetar los principios SOLID te recomendaria crear la regla utilizando las clases Rules y utilizar esta en tu FormRequest.
          De esta forma estarás respetando el principio de Open/Close (O de SOLID) y Single Responsibility (S de SOLID).
          Saludos!

  6. Muy buena explicación! Gracias por tan valioso aporte!

    Aprovecho para pedir algo de ayuda:

    He desarrollado un muy pequeño proyecto en Laravel 5.8, el cual consiste en un par de vistas para consultar comprobantes de pago registrados en una BBDD, la primera muestra un Formulario que pide los datos para la consulta y la segunda muestra el resultado. Implementé las rutas necesarias en el archivo web.php, el Controller y un Form Request para validar los datos del formulario. En el formulario he colocado el token ( @csrf ) porque uso el método POST al enviar la solicitud.
    Todo me había funcionado perfectamente, haciendo las validaciones respectivas y de la noche a la mañana, sin hacer ningún cambio en el proyecto, al hacer una consulta salta el error: 419 de página expirada, he modificado el mildleware y agregado la ruta del formulario como excepción(aunque no es aconsejable) y ya no me da el error 419 pero tampoco me valida, es decir, no me hace las validaciones del form request.

    Mucho sabría agradecer un poco de orientación.

  7. Excelente post, está súper claro.

    Tengo una duda, dentro de los Form Request ¿existe una forma de ver cual fue el Request que fue enviado para validar?

    Espero me puedas ayudar!

      1. Suponiendo que en mi Form Request quiero validar lo siguiente:

        public function rules()
        {
        return [
        ‘month’ => ‘required’,
        ‘year’ => ‘required’,
        ‘file’ => ‘required|file’
        ];
        }

        ¿Cómo puedo saber el valor que fue enviado para month, year y file dentro de mi Form Request?

        Sé que al hacer validación sin Form Request dentro de mi controlador puedo imprimir un log info para ver los valores de la siguiente manera:
        info($request)

        Y eso me devolvería lo siguiente dentro de los logs de Laravel:

        local.INFO: array (
        ‘_token’ => ‘obtPjxMr49NgaeH3ZFcLvbibiipgfA091NmNY3V4’,
        ‘month’ => ‘1’,
        ‘year’ => ‘1995’,
        ‘file’ =>
        Illuminate\Http\UploadedFile::__set_state(array(
        ‘test’ => false,
        ‘originalName’ => ‘7up_relacion_premios.csv’,
        ‘mimeType’ => ‘text/csv’,
        ‘error’ => 0,
        ‘hashName’ => NULL,
        )),
        )

        1. Para saber el valor de los input en tu FormRequest tenes que usar $this. Por ejemplo, $this->month. Recuerda que cuando estas fuera del FormRequest $request es un objecto de FormRequest. Por eso, dentro del FormRequest debes utilizar $this.

          Espero que te sirva, saludos amigo.

  8. Saludos amigo, resulta que ando implementando este método que enseñas del FormRequest pero la petición entra al servidor por el métido POST y justo cuando indico en el $redirectAction hacia donde debe continuar recibo el error: The GET method is not supported for this route. Supported methods: POST.

    Tal parece que el $redirectAction redirecciona usando el métido GET. Alguna recomendación para solventar esto? ya que estoy usando a Laravel para la API REST nada más.

    1. Lo he logrado así:
      use Illuminate\Http\JsonResponse;
      use Illuminate\Validation\ValidationException;
      use Illuminate\Contracts\Validation\Validator;
      use Illuminate\Http\Exceptions\HttpResponseException;

      /**
      * Handle a failed validation attempt.
      *
      * @param \Illuminate\Contracts\Validation\Validator $validator
      * @return void
      *
      * @throws \Illuminate\Validation\ValidationException
      */
      protected function failedValidation(Validator $validator)
      {
      $errors = (new ValidationException($validator))->errors();
      throw new HttpResponseException(response()->json([‘errors’ => $errors
      ], JsonResponse::HTTP_UNPROCESSABLE_ENTITY));
      }

  9. Cómo se pueden validar los datos de una tabla que se crea con javascript? los datos los tengo en unos inputs y los name los tengo asi name=nombre[ ] name=apellido[ ] como deberia de colocarlos en el formRequest?? ‘edad’=>’required’, o ‘edad[ ]’=>’required’, cual de las formas es la correcta?? o como se deberia colocar ?? la verdad no me reconoce ninguna de las dos

  10. Buenas como siempre tus posts son muy bueno, te hago una consulta para crear una validación de una clave compuesta suponiendo que tengo esta tabla:
    Schema::create(‘curso_materia’, function (Blueprint $table) {
    $table->bigIncrements(‘id’);
    $table->integer(‘cursoId’)->unsigned();
    $table->integer(‘materiaId’)->unsigned();
    $table->unique([‘cursoId’, ‘materiaId’]); <– clave unica compuesta
    });
    como haría la validacion del request?? porque estuve buscando pero no logro hacerla.

  11. hola si lo ideal es crear los request asi [Acción][Modelo]Request
    es bueno o no ordenarlos dentro de carpetas? cuando por ejm tengas +20 modelos ya q en total serian +100 archivos de request

  12. hola que sucede cuando los datos de eloquent llegan nesteados al usar un with ??
    public function getAllProyectos(){
    $proyecto = Proyecto::with(‘servicio’,’estado’,’cliente’)->where(‘estado_id’, ‘=’, ‘2’)->orderBy(‘fechaAlta’, ‘DESC’)->get();
    return response()->json($proyecto, 200);
    }

    y queremos hacer la validacion ???

    con elementos de la raiz de los datos me funciona pero con los nesteados no hay manera , como se realizaria ??

    lo tengo asi
    return [
    ‘servicio’ => ‘required’,
    ‘fechaAlta’ => ‘required’,
    ‘estado_id’ => ‘required’,
    ‘pvp’ => ‘required’,

    // ‘cliente.nombre’ => ‘required’,
    // ‘cliente.nombreFiscal’ => ‘required’,
    // ‘cliente.dni’ => ‘required’,
    // ‘cliente.telefono’ => ‘required’,
    // ‘cliente.email’ => ‘required’,

    ];

Sliding Sidebar

Matias Echazarreta

¡Hola!

Mi nombre es Matias Echazarreta.
Soy desarrollador web con más de 12 años de experiencia. Amante de Laravel, de los libros y del rock de los ’90. Te puedes comunicar conmigo  por trabajos de contratación, haciendo click aquí.

Nuestro Patreon

Desde Patreon puedes solicitar asesoria personalizado. ¡Ir a Patreon!

Suscríbete a nuestra lista de correo