laravel

Validación de formularios en Laravel

En este post voy a mostrarte cómo hacer el envío de un formulario con Laravel, así como la validación del mismo del lado del servidor.

Laravel provee una forma fácil de validar, además de mostrar los errores en una lista que puede estar bajo el formulario.

Nota: si quieres usar la validación con mensajes en español, por favor, mira este post, también te invito a ver más tutoriales de Laravel.

Formulario

El formulario queda como se ve a continuación:

@extends("maestra")
@section("titulo", "Agregar área")
@section("contenido")
    <div class="container">
        <div class="columns">
            <div class="column is-half-tablet">
                <h1 class="is-size-1">Agregar área</h1>
                <form method="POST" action="{{route("guardarArea")}}">
                    @csrf
                    <div class="field">
                        <label class="label">Nombre</label>
                        <div class="control">
                            <input autocomplete="off" name="nombre" class="input" type="text"
                                   placeholder="Nombre de área">
                        </div>
                    </div>
                    @include("errores")
                    @include("notificacion")
                    <button class="button is-success">Guardar</button>
                    <a class="button is-primary" href="{{route("areas")}}">Ver todas</a>
                </form>
                <br>
            </div>
        </div>
    </div>
@endsection

Presta atención al action, que va a una ruta con nombre llamada “guardarArea“. Otra cosa que debes notar es el atributo name del input, pues ese nombre lo vamos a usar en la validación.

También fíjate en que incluye algo llamado “errores” cuyo código veremos abajo.

Ruta

En mi archivo de rutas, simplemente llamo a un método del controlador:

<?php
Route::post("areas/agregar", "AreasController@agregar")->name("guardarArea");

Se invocará al método agregar de AreasController.

El FormRequest

Para validar y dejar limpio el controlador, hay que crear un Request, pues nos permite tener mayor control y separar la validación:

Los requests se ubican en app/Http/Requests y deben extender de FormRequest.

Lo que importa son dos métodos: authorize y rules.

  • El de authorize indica si el usuario está autorizado para hacer esa petición (aquí podríamos verificar permisos o roles)
  • El de rules indica la validación

Para la validación simplemente regresamos un arreglo con las reglas, cuya lista completa puedes ver aquí.

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class GuardarArea extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */    public function rules()
    {
        return [
            "nombre" => "required|max:255"
        ];
    }
}

El controlador

Dentro del controlador, vamos a recibir ese FormRequest que acabamos de crear.

La magia aquí ocurre en que el método del controlador será llamado únicamente si la validación pasa, es decir, en el controlador asumimos que ya está validado, pues si la validación falla, el método no será llamado

De esa forma separamos la lógica.

<?php

namespace App\Http\Controllers;

use App\Area;
use App\Http\Requests\GuardarArea;

class AreasController extends Controller
{
    //
    public function agregar(GuardarArea $peticion)
    {
        $area = new Area;
        $area->nombre = $peticion->nombre;
        $exitoso = $area->save();
        $mensaje = "Área agregada correctamente";
        $tipo = "success";
        if ($exitoso) {
            $mensaje = "Error agregando área. Intente más tarde";
            $tipo = "danger";
        }
        return redirect()->route("formularioArea")
            ->with("mensaje", $mensaje)
            ->with("tipo", $tipo);
    }
}

Mostrar los errores

Ahora vamos a ver la plantilla de errores. Laravel pone los errores de la validación en una variable llamada $errors.

Podemos iterarlos con un foreach (para obtenerlos a todos se usa $errors->all()) e imprimirlos.

El contenido del archivo que muestra errores queda así:

@if(!empty($errors->all()))
    <div class="notification is-danger">
        <h4 class="is-size-4">Por favor, valida los siguientes errores:</h4>
        <ul>
            @foreach ($errors->all() as $mensaje)
                <li>
                    {{$mensaje}}
                </li>
            @endforeach
        </ul>
    </div>
@endif

Y lo estamos incluyendo en el formulario.

Demostración

Ahora veamos la demostración. Como lo dije anteriormente, el método del controlador ni siquiera será llamado si la validación falla.

Al enviar el formulario con datos erróneos:

Validación de formulario con Laravel

Y si los datos son correctos, se muestra un mensaje de retroalimentación exitoso.

Más validaciones

Si crees que esa validación es muy simple, te muestro otra:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class AgregarArticuloDeInventarioRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */    public function rules()
    {
        return [
            "fechaAdquisicion" => "required|date_format:Y-m-d",
            "codigo" => "required|max:255",
            "numeroFolioComprobante" => "max:255",
            "descripcion" => "required|max:255",
            "estado" => "required|in:regular,malo,inservible,noEncontrado",
            "observaciones" => "max:255",
            "costoAdquisicion" => "required|numeric|between:1,99999999.99",
            "areas_id" => "required|exists:areas,id",//Requerido y que exista en áreas, columna id :)
        ];
    }

}

En este caso incluso estoy validando que el id de área exista en otra tabla.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.