Qué son las reglas de validación personalizadas
Laravel incluye una amplia lista de reglas de validación integradas, pero hay ocasiones en las que necesitas lógica de validación específica de tu aplicación. Con las reglas personalizadas puedes definir lógica de validación reutilizable en clases o closures y usarla igual que las reglas estándar. Hay dos formas principales de definir reglas personalizadas:- Objetos de regla — muy reutilizables y fáciles de testear.
- Closures — recomendados para reglas simples de un solo uso.
Objetos de regla
Generar una clase de regla
Con el comando Artisanmake:rule se crea una nueva clase de regla. La clase generada se coloca en el directorio app/Rules.
Implementar la interfaz ValidationRule
Implementa el métodovalidate en la clase generada. Este método llama al closure $fail cuando la validación falla.
$fail puedes usar el placeholder :attribute; Laravel lo sustituye por el nombre del campo.
Aplicar el objeto de regla
Pasa la instancia del objeto de regla al array de validación.rules() de un form request.
Mensajes de error usando claves de traducción
En lugar de escribir el mensaje directamente, puedes usar claves de traducción.lang/es/validation.php.
Añadir varios mensajes de error
Para reportar varios errores en un mismo campo, llama a$fail más de una vez.
Reglas basadas en closures
Para reglas simples que solo se usan una vez en la aplicación, puedes definirlas mediante closures sin crear una clase.Reglas implícitas (se ejecutan aunque el valor esté vacío)
Por defecto, si el campo está vacío o no existe, las reglas personalizadas no se ejecutan. Si quieres que la regla se ejecute también con valores vacíos, genera la clase con la opción--implicit.
ImplicitRule. Esta interfaz no añade métodos; simplemente actúa como señal para Laravel.
Acceso a datos
DataAwareRule — acceso a todos los datos del formulario
Si necesitas validar en función del valor de otros campos, implementa la interfazDataAwareRule. El método setData se invoca automáticamente antes de empezar la validación.
ValidatorAwareRule — acceso a la instancia del validator
Para acceder a toda la información del validator (reglas que han fallado, mensajes personalizados, etc.), implementa la interfazValidatorAwareRule.
Casos de uso prácticos
Comprobación de caracteres japoneses
Regla para validar el conjunto de caracteres (por ejemplo, japonés).Validación de formato de teléfono
Regla para validar el formato de números de teléfono de Japón.Restricción de unicidad con ID de tenant
Restricción típica en aplicaciones multi-tenant: unicidad dentro del ámbito de un tenant.1
Crear la clase de regla
2
Usarla en un form request
3
En actualización, excluir el propio ID
Cuando actualizas un registro existente, excluye su propio ID de la comprobación de duplicados.
Registro de reglas en un service provider
Añadir reglas con Validator::extend()
ConValidator::extend() puedes usar la regla personalizada en formato de cadena ('nombre_de_la_regla'). Regístrala en el método boot() de AppServiceProvider.
Validator::extend() pueden usarse como una cadena.
Añadir métodos estáticos a la clase Rule
Añadiendo macros a la facadeRule puedes ofrecer una API fluida del tipo Rule::myRule().
Detalles de la implementación interna
Veamos cómoIlluminate\Validation\Validator invoca las reglas personalizadas.
Dentro del validator, validateAttribute() procesa cada campo. Si la regla implementa la interfaz ValidationRule, se llama al método validateUsingCustomRule().
ImplicitRule se decide con isImplicit(), que hace que la regla se ejecute incluso cuando el valor está vacío.
Páginas relacionadas
Validación (introducción)
Revisa cómo validar de forma estándar en controladores y form requests.