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

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

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

Компонент 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\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;

class User
{
    protected $name;

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('name', new Assert\NotBlank());
        $metadata->addPropertyConstraint('name', new Assert\Length(array(
            '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(), чтобы сконфигурировать массив путей файлов.

AnnotationLoader

Наконец, компонент предоставляет AnnotationLoader, чтобы получать метаданные из аннотации класса. Аннотации определяются, как классы с префиксом @, включённые в комментарии блока doc (/** ... */). Например:

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

class User
{
    /**
    * @Assert\NotBlank()
    */
    protected $name;
}

Чтобы подключить загрузчик аннотаций, вызовите метод enableAnnotationMapping() Он требует необязательный экземпляр чтения аннотации, который по умолчанию является Doctrine\Common\Annotations\AnnotationReader:

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

$validator = Validation::createValidatorBuilder()
    ->enableAnnotationMapping()
    ->getValidator();

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

Note

Для того, чтобы использовать загрузчик аннотаций, вам нужно было установить в Composеr пакеты doctrine/annotations и doctrine/cache.

Tip

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

1
2
3
4
5
6
7
8
9
use Composer\Autoload\ClassLoader;
use Doctrine\Common\Annotations\AnnotationRegistry;

/** @var ClassLoader $loader */
$loader = require __DIR__.'/../vendor/autoload.php';

AnnotationRegistry::registerLoader([$loader, 'loadClass']);

return $loader;

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

Компонент также предоставляет класс 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() и передайте ваш собственный класс кеширования (который должен реализовывать CacheInterface):

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(). Теперь вам нужно самостоятельно внедрять их в пользоательскую фабрику метаданных.