Завантаження джерел

Дата оновлення перекладу 2022-12-12

Завантаження джерел

Компонент 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.

Щоб вирішити цю проблему, викличте метод конструктора Валідатор setMetadataCache() і передайте ваш власний клас кешування (який повинен реалізовувати CacheInterface):

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

$validator = Validation::createValidatorBuilder()
    // ... додайте завантажувачі
    ->setMetadataCache(new SomeImplementCacheInterface());
    ->getValidator();

Note

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

Використання користувацької 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(). Тепер вам потрібно самостійно впроваджувати їх у користувацьку фабрику метаданих.