Nuevo en Symfony 5.1: Conjuntos reusables de validadores
En ciertas aplicaciones es común tener que reutilizar el mismo conjunto de validadores en varios sitios. Considera por ejemplo una aplicación que permite registrar usuarios, cambiar contraseñas y recordar contraseñas olvidadas. Esa aplicación podría utilizar diferentes DTOs para cada funcionalidad pero todos ellos incluir la misma propiedad para almacenar la nueva contraseña del usuario. Esa propiedad se debe validar de la misma manera en todos los casos.
En Symfony 5.1, podrás solucionar este tipo de casos gracias al nuevo validador
Compound
, que permite reusar uno o más validadores (no importa si son propios
de Symfony o creados por tu aplicación):
namespace App\Validator; use Symfony\Component\Validator\Constraints\Compound; use Symfony\Component\Validator\Constraints\Length; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\NotCompromisedPassword; use Symfony\Component\Validator\Constraints\Type; /** * @Annotation */ class MatchesPasswordRequirements extends Compound { protected function getConstraints(array $options): array { return [ new NotBlank(), new Type('string'), new Length(['min' => 12]), new NotCompromisedPassword(), ]; } }
Ahora ya puedes aplicar este validador a tus objetos como si fuera cualquier otro validador normal:
namespace App\Dto; // ... use App\Validator\MatchesPasswordRequirements; class ChangePasswordDto { /** * @MatchesPasswordRequirements */ private $newPassword; // ... }
Esta funcionalidad fue contribuida por Maxime Steinhausser en el pull request #34334.
Validadores secuenciales
En Symfony 5.1 también hemos añadido otra funcionalidad, diferente pero relacionada,
que permite ejecutar validadores de manera secuencial. Esto ya era posible en las
versiones anteriores de Symfony gracias al validador GroupSequence, pero en
Symfony 5.1 hemos simplificado mucho esta funcionalidad gracias al nuevo validador
Sequentially
.
Solamente tienes que pasar un conjunto de uno o más validadores a Sequentially
y Symfony intentará ejecutarlos en ese mismo orden. Si algún validador falla,
Symfony no seguirá ejecutando el resto de validadores. Por este motivo, es muy
útil para evitar errores en validadores que esperan ciertos tipos de datos y
también para evitar llamadas a validadores que son pesados o lentos:
/** * @var string * * @Assert\Sequentially({ * @Assert\Type("string"), * @Assert\Length(min="4"), * @Assert\Regex("[a-z]"), * @SomeCustomConstraintWithHeavyExternalCalls(), * }) */ public $someProperty;
Esta funcionalidad fue contribuida por Maxime Steinhausser en el pull request #34456.
Fuente: New in Symfony 5.1: Reusable sets of constraints
Comentarios
Proyectos Symfony destacados
La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.