Validación de formularios con Laravel: guía completa con ejemplos

Validación de formularios con Laravel: guía completa con ejemplos

Laravel ofrece un sistema de validación de datos robusto y fácil de usar que te permite garantizar la integridad y la seguridad de los datos ingresados por los usuarios. El framework incluye una serie de reglas de validación predefinidas que puedes aplicar a los datos entrantes de las solicitudes HTTP, permitiéndote validar campos como correos electrónicos, contraseñas, números, fechas, entre otros.

En esta guía completa, exploraremos en detalle cómo implementar laravel validations en tus aplicaciones Laravel, desde la configuración básica hasta la creación de reglas personalizadas. Aprenderemos a utilizar las reglas de validación predefinidas, a manejar errores de validación y a personalizar la experiencia del usuario mediante mensajes de error informativos.

Configurando la validación

Laravel incluye un sistema de validación predefinido que se activa automáticamente en la clase base del controlador. La clase Controller utiliza el rasgo ValidatesRequests, que proporciona un método conveniente llamado validate() para validar las solicitudes entrantes. Este método recibe como argumentos el array de datos de la solicitud y un array de reglas de validación.

«`php
use IlluminateHttpRequest;

class UserController extends Controller
{
public function store(Request $request)
{
$validatedData = $request->validate([
‘name’ => ‘required|string|max:255’,
‘email’ => ‘required|email|unique:users’,
‘password’ => ‘required|string|min:8|confirmed’,
]);

    // Crea un nuevo usuario con los datos validados
    $user = User::create($validatedData);

    // Redirecciona al usuario a la página de inicio o a otra página
    return redirect()->route('home');
}

}
«`

En el ejemplo anterior, estamos validando los campos name, email y password. La regla required asegura que el campo no esté vacío, string indica que el valor debe ser una cadena de texto, max:255 limita la longitud del campo a 255 caracteres, email verifica que el formato del correo electrónico sea válido, unique:users verifica que el correo electrónico no esté ya registrado en la tabla users, min:8 establece la longitud mínima de la contraseña a 8 caracteres y confirmed asegura que la contraseña se confirme correctamente.

Reglas de validación predefinidas

Laravel proporciona una amplia variedad de reglas de validación predefinidas que puedes utilizar en tus proyectos:

  • required: El campo es obligatorio.
  • string: El campo debe ser una cadena de texto.
  • integer: El campo debe ser un entero.
  • numeric: El campo debe ser un número.
  • boolean: El campo debe ser un valor booleano (true o false).
  • email: El campo debe tener un formato de correo electrónico válido.
  • url: El campo debe tener un formato de URL válido.
  • alpha: El campo solo puede contener letras.
  • alpha_num: El campo solo puede contener letras y números.
  • alpha_dash: El campo solo puede contener letras, números, guiones bajos y guiones.
  • min: El campo debe tener al menos un número específico de caracteres o elementos.
  • max: El campo debe tener como máximo un número específico de caracteres o elementos.
  • between: El campo debe tener un número específico de caracteres o elementos entre dos límites.
  • in: El campo debe ser uno de los valores especificados.
  • not_in: El campo no debe ser uno de los valores especificados.
  • unique: El campo debe ser único en la base de datos.
  • exists: El campo debe existir en la base de datos.
  • date: El campo debe ser una fecha válida.
  • date_format: El campo debe tener un formato de fecha específico.
  • after: El campo debe ser una fecha posterior a una fecha especificada.
  • before: El campo debe ser una fecha anterior a una fecha especificada.
  • timezone: El campo debe ser una zona horaria válida.
  • confirmed: El campo debe ser confirmado mediante otro campo.
  • accepted: El campo debe ser un valor booleano «true» o una cadena de texto «yes», «on» o «1».
  • declined: El campo debe ser un valor booleano «false» o una cadena de texto «no», «off» o «0».
LEER:  Java Collections Framework: Guía Completa

Personalizando mensajes de error

Laravel permite personalizar los mensajes de error que se muestran al usuario en caso de que la validación falle. Puedes definir mensajes personalizados para cada regla de validación utilizando el array $messages en tu controlador o en el archivo de configuración app/config/validation.php.

«`php
use IlluminateHttpRequest;

class UserController extends Controller
{
public function store(Request $request)
{
$messages = [
‘name.required’ => ‘El campo nombre es obligatorio.’,
‘email.email’ => ‘Por favor, ingresa un correo electrónico válido.’,
‘password.min’ => ‘La contraseña debe tener al menos :min caracteres.’,
];

    $validatedData = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users',
        'password' => 'required|string|min:8|confirmed',
    ], $messages);

    // Crea un nuevo usuario con los datos validados
    $user = User::create($validatedData);

    // Redirecciona al usuario a la página de inicio o a otra página
    return redirect()->route('home');
}

}
«`

En este ejemplo, estamos definiendo mensajes de error personalizados para las reglas required, email y min. El mensaje name.required se mostrará si el campo name es obligatorio, el mensaje email.email se mostrará si el formato del correo electrónico no es válido, y el mensaje password.min se mostrará si la contraseña no tiene al menos 8 caracteres.

Validación de atributos específicos

Si necesitas validar solo algunos atributos específicos de la solicitud, puedes utilizar el método only() o except() en la instancia de Request.

«`php
use IlluminateHttpRequest;

class UserController extends Controller
{
public function update(Request $request, $id)
{
$validatedData = $request->only([‘name’, ‘email’])->validate([
‘name’ => ‘required|string|max:255’,
‘email’ => ‘required|email|unique:users,email,’ . $id,
]);

    // Actualiza el usuario con los datos validados
    $user = User::find($id)->update($validatedData);

    // Redirecciona al usuario a la página de inicio o a otra página
    return redirect()->route('home');
}

}
«`

En este ejemplo, estamos validando solo los campos name y email de la solicitud, utilizando el método only(). La regla unique:users,email,' . $id asegura que el correo electrónico sea único en la tabla users, excluyendo el usuario actual con el ID $id.

Validación de arrays

Laravel también te permite validar arrays de datos utilizando la sintaxis de «punto» en las reglas de validación.

LEER:  Construyendo un sistema operativo desde cero: Implementación de comandos básicos en Python para LFS

«`php
use IlluminateHttpRequest;

class ProductController extends Controller
{
public function store(Request $request)
{
$validatedData = $request->validate([
‘name’ => ‘required|string|max:255’,
‘details..description’ => ‘required|string’,
‘details.
.price’ => ‘required|numeric’,
]);

    // Crea un nuevo producto con los datos validados
    $product = Product::create($validatedData);

    // Redirecciona al usuario a la página de inicio o a otra página
    return redirect()->route('home');
}

}
«`

En este ejemplo, estamos validando los campos de un array llamado details. La regla details.*.description asegura que todos los campos description dentro del array details sean obligatorios y sean una cadena de texto, y la regla details.*.price asegura que todos los campos price sean obligatorios y sean números.

Reglas de validación personalizadas

Si necesitas una regla de validación que no esté incluida en las reglas predefinidas, puedes crear tus propias reglas personalizadas. Las reglas personalizadas se definen en la clase AppProvidersValidationServiceProvider o en un archivo de servicio separado.

«`php
use IlluminateContractsValidationRule;

class UniqueEmailForCompany implements Rule
{
public function passes($attribute, $value)
{
return User::where(‘email’, $value)
->where(‘companyid’, $this->companyid)
->doesntExist();
}

public function message()
{
    return 'El correo electrónico ya está registrado para esta empresa.';
}

}
«`

En este ejemplo, estamos creando una regla personalizada llamada UniqueEmailForCompany que verifica si un correo electrónico ya está registrado para una empresa específica. La regla recibe como argumento el valor del campo y un ID de empresa. Si el correo electrónico ya está registrado para la empresa, la regla devuelve false y muestra el mensaje de error personalizado.

Después de crear la regla personalizada, debes registrarla en el archivo de configuración app/config/validation.php.

php
'custom' => [
'unique_email_for_company' => 'AppRulesUniqueEmailForCompany',
],

Ahora puedes utilizar la regla personalizada en las reglas de validación.

LEER:  Lua Tut: Guía Completa para Principiantes y Expertos

php
$validatedData = $request->validate([
'email' => 'required|email|unique_email_for_company:'.auth()->user()->company_id,
]);

Validación en la vista

Puedes mostrar los errores de validación en la vista utilizando la variable $errors.

html
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif

La variable $errors es una instancia de la clase IlluminateSupportMessageBag, que contiene todos los errores de validación. Puedes acceder a los errores individuales utilizando el método all(), que devuelve un array de todos los errores. También puedes acceder a los errores específicos de un campo utilizando el método get() con el nombre del campo como argumento.

Manejando errores de validación

Si la validación falla, Laravel redirecciona automáticamente al usuario a la página anterior con los errores de validación. Puedes personalizar la lógica de manejo de errores utilizando el método withErrors() en el objeto de redirección.

php
return redirect()->back()->withErrors($validator);

El método withErrors() recibe un objeto Validator como argumento. También puedes usar el método withInput() para mantener los datos de la solicitud en la página de redirección.

Conclusión

En esta guía, hemos explorado en profundidad las características de validación de Laravel, desde la configuración básica hasta la creación de reglas personalizadas. Hemos aprendido a utilizar las reglas de validación predefinidas, a personalizar mensajes de error, a validar arrays de datos y a manejar errores de validación.

Dominar la validación de datos en Laravel es crucial para construir aplicaciones web seguras y confiables. Al aplicar las técnicas de validación que hemos aprendido, podrás garantizar que los datos ingresados por los usuarios sean válidos, correctos y seguros.