Skip to content

Latest commit

 

History

History
98 lines (78 loc) · 3.37 KB

extensions.md

File metadata and controls

98 lines (78 loc) · 3.37 KB

Extensões

A arquitetura do validator permite reabastecer a funcionalidade que falta por meio de extensões. Algumas já existem e estão disponíveis para uso. Observe que eles não são oficiais no sentido de não fazerem parte dos pacotes Yiisoft.

Cenários

Yii2 tem um recurso de cenários pronto para uso. Quem já usou isso pode estar se perguntando por que não é mais o caso com este pacote. Bem, pensamos que do ponto de vista arquitetônico, é uma falha de design. O que parece ser mais conciso no início, tende a crescer e se torna mais difícil de ler e manter com uma quantidade maior de atributos/cenários/lógica de negócios, enquanto o custo de reescrita pode ser bastante alto. Isso foi comprovado na prática, então essa abordagem é desencorajada e a forma recomendada com este pacote é usar DTO separado para cada cenário. Claro, isso levará a alguma duplicação de código, mas é aceitável e terá retorno no futuro. De qualquer forma, decidimos disponibilizá-lo através de uma extensão, mas use-a com cautela.

O pacote Yii Validator Scenarios adiciona a regra especial On que permite agrupar outras regras declarando cenários específicos.

Um exemplo da classe usando cenários:

use Vjik\Yii\ValidatorScenarios\On;
use Yiisoft\Validator\Rule\Email;
use Yiisoft\Validator\Rule\Length;
use Yiisoft\Validator\Rule\Required;

final class UserDto
{
    public function __construct(
        #[On(
            'signup',
            [new Required(), new Length(min: 7, max: 10)]
        )]
        public string $name,

        #[Required]
        #[Email]
        public string $email,

        #[On(
            ['login', 'signup'],
            [new Required(), new Length(min: 8)],
        )]
        public string $password,
    ) {
    }
}

Um cenário ativo para a validação atual é determinado por um parâmetro de contexto de validação dedicado:

use Yiisoft\Validator\ValidationContext;
use Yiisoft\Validator\Validator;

$context = new ValidationContext([On::SCENARIO_PARAMETER => 'signup']);
$result = (new Validator())->validate($userDto, context: $context);

Wrapper para regras do Symfony

O pacote Yii Validator Symfony Rule adapta as restrições do framework Symfony para serem usadas como regras no Yii Validator.

Usá-lo é simples, tudo que você precisa fazer é agrupar uma restrição do Symfony (ou uma lista delas) com a regra SymfonyRule fornecido por esta extensão.

use Symfony\Component\Validator\Constraints\{CssColor, NotEqualTo, Positive};
use Vjik\Yii\ValidatorSymfonyRule\SymfonyRule;
use Yiisoft\Validator\Rule\Length;
use Yiisoft\Validator\Rule\Required;

final class Car
{
    #[Required]
    #[Length(min: 3, skipOnError: true)]
    public string $name = '';

    #[Required]
    // A single constraint.
    #[SymfonyRule(
        new CssColor(CssColor::RGB),
        skipOnError: true,
    )]
    public string $cssColor = '#1123';

    // Multiple constraints.
    #[SymfonyRule([
        new Positive(),
        new NotEqualTo(13),
    ])]
    public int $number = 13;
}