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:
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.