Skip to main content

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 Artisan make: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étodo validate en la clase generada. Este método llama al closure $fail cuando la validación falla.
En la cadena que pasas al closure $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.
Se usa igual dentro del método 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.
Añade el mensaje en el archivo 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.
Las reglas por closure son cómodas porque se definen en línea, pero son difíciles de reutilizar y de testear de forma aislada, así que si necesitas usar la lógica en varios sitios es preferible extraerla a un objeto de regla.

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.
La clase generada implementa la interfaz ImplicitRule. Esta interfaz no añade métodos; simplemente actúa como señal para Laravel.
ImplicitRule solo indica a Laravel que «el atributo es obligatorio». Que la validación realmente falle cuando el valor esté vacío depende de lo que hagas dentro del método validate.

Acceso a datos

DataAwareRule — acceso a todos los datos del formulario

Si necesitas validar en función del valor de otros campos, implementa la interfaz DataAwareRule. El método setData se invoca automáticamente antes de empezar la validación.
Ejemplo de uso:

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 interfaz ValidatorAwareRule.

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()

Con Validator::extend() puedes usar la regla personalizada en formato de cadena ('nombre_de_la_regla'). Regístrala en el método boot() de AppServiceProvider.
Las reglas registradas con Validator::extend() pueden usarse como una cadena.
Validator::extend() es un mecanismo de registro más antiguo que los objetos de regla. Para código nuevo, se recomienda usar objetos que implementen la interfaz ValidationRule.

Añadir métodos estáticos a la clase Rule

Añadiendo macros a la facade Rule puedes ofrecer una API fluida del tipo Rule::myRule().

Detalles de la implementación interna

Veamos cómo Illuminate\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().
El tratamiento de ImplicitRule se decide con isImplicit(), que hace que la regla se ejecute incluso cuando el valor está vacío.
Puedes implementar DataAwareRule y ValidatorAwareRule a la vez. Si una clase implementa ambas interfaces, se ejecutan las dos inyecciones.

Páginas relacionadas

Validación (introducción)

Revisa cómo validar de forma estándar en controladores y form requests.
Última modificación el 13 de julio de 2026