Laravel nos proporciona una gran variedad de reglas para validar las peticiones o requests, pero cuando ninguna se adapta al contexto de lo que se quiere verificar debemos crear una regla personalizada Esto ya era posible en Laravel por ejemplo extendiendo la clase de validación, sin embargo, ahora en Laravel 5.5 podremos crearla de manera rápida y sencilla con el comando de Artisan make:rule
. En el siguiente video te explicaremos cómo crear reglas de validación personalizadas y además a probarlas con PHPUnit.
Notas
Por Clemir Rondón.
En versiones anteriores de Laravel, podíamos crear reglas usando el método extend
como explicamos en este tutorial reglas de validación personalizadas en Laravel pero ahora podemos hacerlo de una manera más sencilla:
Creación de la regla
Para crear reglas personalizadas para la validación primero debemos ejecutar el comando php artisan make:rule
seguido del nombre de la regla, por ejemplo:
php artisan make:rule RealText
Como resultado se creará el nuevo directorio (si aún no existe! Rules
y dentro de él, la clase para definir la regla de validación.
La clase creada implementa la interfaz Illuminate\Contracts\Validation\Rule
por tanto, se requiere de los métodos passes
y message
.
passes
es el método que determina si la regla de validación pasa. Recibe dos parámetros: $attribute
que es el nombre del atributo que se está evaluando y $value
el valor que se va evaluar con la regla. Este método debe devolver un booleano que indique si elementos pasados cumplen o no con la regla de validación.
message
es el método que devuelve el mensaje de error en caso que no se cumpla la regla de validación. Recuerda que puedes usar el helper trans
con el componente de traducciones para hacer tu aplicación multi-idioma como lo explicamos en el tutorial Cómo usar el componente de traducciones de Laravel.
Adicionalmente, esta clase tiene un constructor que nos permite inyectar alguna dependencia que nos ayude a definir la regla. En caso de no tener ninguna puedes eliminarlo de la clase.
Uso de la regla creada
Luego de crear la regla y completar los métodos ya está lista para ser usada en la validación de una petición. Por ejemplo haciendo uso del nuevo método validate
del objeto request visto en la lección Nueva forma de validar peticiones y obtener datos en Laravel 5.5 podemos hacer algo como lo siguiente:
request()->validate([ 'bio' => new RealText(), ]);
En caso de tener varias reglas junto con una regla personalizadas para un mismo atributo usamos la sintaxis de array, es decir, cada regla es un item del array de esta manera:
request()->validate([ 'bio' => [ 'required', new RealText(), ] ]);
Prueba unitaria
Para escribir una prueba unitaria que nos garantice que la regla está funcionado correctamente, creamos primero la clase:
php artisan make:test RealTextRuleTest --unit
Le indicamos la opción --unit
para que cree la clase en el directorio tests/Unit
Como la regla de validación personalizada no es más que una clase entonces en la prueba instanciamos la clase y llamamos al método passes
enviándole como argumento los posibles valores (segundo argumento) que prueben si está funcionando bien la regla, es decir, valores cuando debe dar verdadero y valores cuando debe retornar falso.
Si quieres aprender más sobre desarrollo con pruebas unitarias, te recomendamos nuestro curso Crea una aplicación con Laravel.
Puedes aprender a crear alias con nuestro tutorial Alias de comandos para la consola Windows/Linux/Mac
Actividad
Anímate a diseñar un formulario que le permita al usuario actualizar su perfil y compartirlo a través de los comentarios o en Slack si formas para de nuestra comunidad.
Material relacionado
- Cómo personalizar los mensajes de error de validación de formularios en Laravel
- Reglas de validación personalizadas en Laravel
- Nueva sintaxis para las reglas de validación: dimensions, exists, unique, in y not_in en Laravel 5.3
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Manejo de excepciones en las pruebas en Laravel 5.5 Lección siguiente Package Discovery en Laravel 5.5