Как валидировать необработанные значения (скалярные значения и массивы)
Дата обновления перевода 2023-07-06
Как валидировать необработанные значения (скалярные значения и массивы)
Обычно вы будете валидировать объекты целиком. Но иногда, вам нужно будет валидировать простое значение - например, убедиться в том, что строка является валидным адресом электронной почты. На самом деле это достаточно легко сделать. Изнутри контроллера это выглядит следующим образом:
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
При использовании групп с ограничением Collection,
используйте, где уместно, ограничение Optional, как объясняется в его справочной
документации.