Як валідувати необроблені значення (скалярні значення та масиви)

Дата оновлення перекладу 2023-06-15

Як валідувати необроблені значення (скалярні значення та масиви)

Зазвичай ви валідуватимете обʼєкти цілком. Але іноді вам потрібно буде валідувати просте значення - наприклад, переконатися в тому, що рядок є валідною адресою електронної пошти. Насправді це достатньо просто зробити. Зсередини контролера це виглядає наступним чином:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// ...
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validator\ValidatorInterface;

// ...
public function addEmail($email, ValidatorInterface $validator)
{
    $emailConstraint = new Assert\Email();
    // всі "опції" обмеження можуть бути встановлені таким чином
    $emailConstraint->message = 'Invalid email address';

    // використати валідатор для валідації значення
    $errors = $validator->validate(
        $email,
        $emailConstraint
    );

    if (!$errors->count()) {
        // ... це валідна адреса електронної пошти, зробити щось
    } else {
        // це *не* валідна адреса електронної пошти
        $errorMessage = $errors[0]->getMessage();

        // ... зробити щось з помилкою
    }

    // ...
}

Викликавши у валідаторі validate, ви можете передати необроблене значення та обʼєкт обмеження, до якого ви хочете застосувати валідацію. Повний перелік доступних обмежень - так само, як і повне імʼя класу для кожного обмеження - доступний у розділі довідник обмежень.

Валідація масивів можлива з використанням обмеження Collection:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidator();

$input = [
    'name' => [
        'first_name' => 'Fabien',
        'last_name' => 'Potencier',
    ],
    'email' => 'test@email.tld',
    'simple' => 'hello',
    'eye_color' => 3,
    'file' => null,
    'password' => 'test',
    'tags' => [
        [
            'slug' => 'symfony_doc',
            'label' => 'symfony doc',
        ],
    ],
];

$groups = new Assert\GroupSequence(['Default', 'custom']);

$constraint = new Assert\Collection([
    // ключі відповідають ключам у масиві введення
    'name' => new Assert\Collection([
        'first_name' => new Assert\Length(['min' => 101]),
        'last_name' => new Assert\Length(['min' => 1]),
    ]),
    'email' => new Assert\Email(),
    'simple' => new Assert\Length(['min' => 102]),
    'eye_color' => new Assert\Choice([3, 4]),
    'file' => new Assert\File(),
    'password' => new Assert\Length(['min' => 60]),
    'tags' => new Assert\Optional([
        new Assert\Type('array'),
        new Assert\Count(['min' => 1]),
        new Assert\All([
            new Assert\Collection([
                'slug' => [
                    new Assert\NotBlank(),
                    new Assert\Type(['type' => 'string']),
                ],
                'label' => [
                    new Assert\NotBlank(),
                ],
            ]),
            new CustomUniqueTagValidator(['groups' => 'custom']),
        ]),
    ]),
]);

$violations = $validator->validate($input, $constraint, $groups);

Метод validate() повертає обʼєкт ConstraintViolationList, яки поводить себе так само, як і масив помилок. Кожна помилка у колекції - це обʼєкт ConstraintViolation, який містить повідомлення про помилку у своєму методі getMessage().

Note

При використанні груп з обмеженням Колекції, використовуйте, де доречно, обмеження Optional, як пояснюється у його довідковій документації.