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