Метаданные

Дата обновления перевода 2023-08-21

Метаданные

Класс ClassMetadata представляет и управляет всеми сконфигурированными ограничениями заданного класса.

Свойства

Компонент Validator может валидировать публичные, защищённые или приватные свойства. Следующий пример отображает, как валидировать, чтоб свойство $firstName класса Author имело как минимум 3 символа:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ...
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Mapping\ClassMetadata;

class Author
{
    private string $firstName;

    public static function loadValidatorMetadata(ClassMetadata $metadata): void
    {
        $metadata->addPropertyConstraint('firstName', new Assert\NotBlank());
        $metadata->addPropertyConstraint(
            'firstName',
            new Assert\Length(["min" => 3])
        );
    }
}

Геттеры

Ограничения могут быть также применены в значению, возвращённому любым публичным геттер методом, которые являются методами, имена которых начинаются с get, has или is. Эта функция позволяет валидировать ваши объекты динамически.

Представьте, что по причинам безопасности, вы хотите валидировать, чтобы поле пароля не соответствовало имени пользователя. Для начала,создайте публичный метод под названием isPasswordSafe(), чтобы определить эту пользовательскую логику валидации:

1
2
3
4
public function isPasswordSafe(): bool
{
    return $this->firstName !== $this->password;
}

Далее, добавьте конфигурацию компонента Validator к классу:

1
2
3
4
5
6
7
8
9
10
11
12
13
// ...
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Mapping\ClassMetadata;

class Author
{
    public static function loadValidatorMetadata(ClassMetadata $metadata): void
    {
        $metadata->addGetterConstraint('passwordSafe', new Assert\IsTrue([
            'message' => 'The password cannot match your first name',
        ]));
    }
}

Классы

Некоторые ограничения позволяют валидировать объект целиком. Например, ограничение Обратного вызова - это общее ограничение, применяемое к самому классу.

Представьте, что класс определяет метод validate() для хранения своей логики валидации:

1
2
3
4
5
6
7
// ...
use Symfony\Component\Validator\Context\ExecutionContextInterface;

public function validate(ExecutionContextInterface $context): void
{
    // ...
}

Потом добавьте конфигурацию компонента Validator в класс:

1
2
3
4
5
6
7
8
9
10
11
// ...
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Mapping\ClassMetadata;

class Author
{
    public static function loadValidatorMetadata(ClassMetadata $metadata): void
    {
        $metadata->addConstraint(new Assert\Callback('validate'));
    }
}