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

Publicada el

13 de marzo de 2020

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.