Загрузка источников

Дата обновления перевода 2024-07-03

Загрузка источников

Компонент Validator использует метаданные для валидации значения. Эти метаданные определяют, как класс, массив или любое другое значение, должны быть валидированы. При валидации класса, метаданные определяются самим классом. При валидации простого значения, метаданные должны быть переданы методам валидации.

Метаданные класса могут быть определены в файле конфигурации или в самом классе. Компонент Validator собирает эти метаданные, используя набор загрузчиков.

See also

Вы узнаете, как определять метаданные в Метаданные.

StaticMethodLoader

Наиболее базовым загрузчиков является StaticMethodLoader. Этот загрузчик получает метаданные путём вызова статического метода класса. Имя метода конфигурируется с использованием метода addMethodMapping() конструктора валидатора:

1
2
3
4
5
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->addMethodMapping('loadValidatorMetadata')
    ->getValidator();

В этом примере, метаданные валидации извлекаются путём выполнения метода класса loadValidatorMetadata():

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

class User
{
    protected string $name;

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

Tip

Вместо того, чтобы несколько раз вызывать addMethodMapping() для добавления нескольких имён метода, вы можете также использовать addMethodMappings(), чтобы установить массив поддерживаемых имён методов.

Загрузчики файлов

Компонент так же предоставляет два загрузчика файлов, один для загрузки YAML файлов, а второй - для XML файлов. Используйте addYamlMapping() или addXmlMapping(), чтобы сконфигурировать расположение этих файлов:

1
2
3
4
5
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->addYamlMapping('config/validation.yaml')
    ->getValidator();

Note

Если вы хотите загружать файлы отображения YAML то вам также понадобится установить компонент Yaml.

Tip

Так же, как и с отображениями метода, вы можете использовать addYamlMappings() и addXmlMappings(), чтобы сконфигурировать массив путей файлов.

The AttributeLoader

Этот компонент предоставляет AttributeLoader для получения метаданных из атрибутов класса. Например:

use SymfonyComponentValidatorConstraints as Assert; // ...

class User { #[AssertNotBlank] protected string $name; }

Чтобы включить загрузчик атрибутов, вызовите метод enableAttributeMapping().

Чтобы отключить загрузчик аннотаций после того, как он был включен, вызовите disableAttributeMapping().

Использование нескольких загрузчиков

Компонент также предоставляет класс LoaderChain для последовательного выполнения несколькиз загрузчиков в том же порядке, в котором они были определены:

ValidatorBuilder уже позаботится об этом, когда вы сконфигурируете несколько отображений:

1
2
3
4
5
6
7
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->enableAnnotationMapping()
    ->addMethodMapping('loadValidatorMetadata')
    ->addXmlMapping('config/validation.xml')
    ->getValidator();

Кеширование

Использование некольких загрузчиков для загрузки метаданных из разных мест удобно, но может замедлить ваше приложение, так как каждому файлу нужно быть проанализированным, валидированным и преображённым в экземпляр ClassMetadata.

Чтобы решить эту проблемы, вызовите метод конструктора Validator setMetadataCache() и передайте ваш собственный класс кеширования (который должен реализовывать интерфейс PSR-6 Psr\Cache\CacheItemPoolInterface):

1
2
3
4
5
6
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    // ... добавьте загрузчики
    ->setMetadataCache(new SomeImplementCacheInterface());
    ->getValidator();

Note

Загрузчики уже используют единичный механизм загрузки. Это означает, что загрузчик будет загружать и анализировать файл только один раз, и помещать это в свойство, которое потом будет использовано при запросе метаданных. Однако, Validator все равно должен объединить все метаданные класса из каждого загрузчика при таком запросе.

Использование пользователькой MetadataFactory

Все загрузчики и кеш передаются экземпляру LazyLoadingMetadataFactory. Этот класс отвечает за создание экземпляра ClassMetadata из всех сконфигурированных источников.

Вы также можете использовать реализацию пользовательской фабрики метаданных, путём создания класса, реализующего MetadataFactoryInterface. Вы можете установить такую пользовательскую реализацию, используя setMetadataFactory():

1
2
3
4
5
6
use Acme\Validation\CustomMetadataFactory;
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->setMetadataFactory(new CustomMetadataFactory(...))
    ->getValidator();

Caution

Так как вы использоуете пользовательскую фабрику метаданных, вы больше не можете конфигурировать используя методы add*Mapping(). Теперь вам нужно самостоятельно внедрять их в пользоательскую фабрику метаданных.