
5. Cómo hacer el email obligatorio en Filament 5: combinando validaciones
Ayer agregaste el campo email y viste cómo Filament valida automáticamente el formato. Pero hay un problema: puedes dejar el email vacío y Filament lo permite. Hoy vamos a cerrar esa puerta. Aprenderás a encadenar dos validaciones: required() y email(). El resultado: un campo que exige tanto que exista como que tenga formato correcto.
🎯 Objetivo de hoy
Hacer que el campo email sea obligatorio Y tenga formato válido, combinando ambas validaciones.
🖥️ Antes / Después
Antes: Puedes dejar el campo «Email» vacío y Filament guarda el cliente sin correo.
Después: Si dejas el email vacío o escribes formato inválido, Filament te detiene con mensaje de error. Debes escribir un email válido sí o sí.
📁 Estructura de carpetas (mapa de hoy)
app/Filament/Resources/
└── Customers/ ⚪ Carpeta del Resource
├── CustomerResource.php ⚪ No lo tocamos hoy
└── Pages/ ⚪ No lo tocamos hoy
| ├── CreateCustomer.php ⚪ No lo tocamos hoy
| ├── EditCustomer.php ⚪ No lo tocamos hoy
| └── ListCustomers.php ⚪ No lo tocamos hoy
├── Schemas/
| └── CustomerForm.php 🟡 🎯 AQUÍ TRABAJAMOS HOY
└── Tables/
└── CustomersTable.php ⚪ No lo tocamos hoy
Hoy modificamos solo el archivo marcado con 🟡. Los demás archivos existen pero no los tocaremos.
📋 Paso 1: Tu código de ayer
Este es el código que tienes actualmente con name obligatorio y email con validación de formato.
📄 Ruta: app/Filament/Resources/Customers/Schemas/CustomerForm.php
<?php
namespace App\Filament\Resources\Customers\Schemas;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class CustomerForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('name')
->required(),
TextInput::make('email')
->email(),
]);
}
}
Fíjate en la línea del email: solo tiene ->email(). Hoy le agregaremos ->required() antes, para que sea obligatorio también.
➕ Paso 2: Tu ladrillo de hoy (una palabra antes de email)
📄 Ruta: app/Filament/Resources/Customers/Schemas/CustomerForm.php
// 🔧 Implementamos: email obligatorio Y con formato válido
TextInput::make('email')
->required()
->email(),
El orden importa: primero required() (que exista), luego email() (que tenga formato). Filament valida en ese orden: primero revisa que no esté vacío, luego que sea email válido.
✅ Paso 3: Código completo con tu ladrillo
📄 Archivo del formulario actualizado
Ruta completa: app/Filament/Resources/Customers/Schemas/CustomerForm.php
<?php
namespace App\Filament\Resources\Customers\Schemas;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class CustomerForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('name')
->required(),
// ✅ Implementado: email obligatorio Y con formato válido
TextInput::make('email')
->required()
->email(),
]);
}
}
¿Viste el cambio? Agregamos ->required() antes de ->email(). Ahora el campo tiene DOS validaciones encadenadas. La sintaxis de PHP permite encadenar métodos uno tras otro con las flechas.
🎉 Verifica tu magia
Abre tu navegador y prueba estos tres casos:
- Ve a
http://tuproyecto.test/admin/customersy clic en «New customer» - Prueba 1 – Vacío: Deja el email vacío, escribe solo el nombre → Error: «The email field is required.»
- Prueba 2 – Formato inválido: Escribe
correo-malen email → Error: «The email field must be a valid email address.» - Prueba 3 – Correcto: Escribe
juan@empresa.com→ Guarda sin problemas
Si alguna validación falla, revisa que:
- Haya
->required()ANTES de->email() - Haya coma después de
->email()si agregas más campos después - No haya punto y coma
;hasta el final del array
¿Lo ves? ¡Ahora tienes un formulario profesional! Dos campos, ambos obligatorios, uno con validación de email. Todo en menos de 10 líneas de código.
💬 ¿Viste cómo encadenar validaciones es tan simple como poner una flecha detrás de otra? Tu formulario ahora es robusto: no acepta nombres vacíos ni emails inválidos. Mañana aprenderemos a limitar la cantidad de caracteres en el nombre, para que nadie escriba un nombre de 500 letras. ¿Te animas a seguir construyendo?
📖 Fuente oficial: Documentación de Filament 5 — Validation
➡️ Próximo paso: Mañana agregaremos ->maxLength(255) al nombre, para limitar cuántos caracteres puede escribir el usuario. Verás cómo Filament cuenta los caracteres en tiempo real.