Метод getMetadataFor
Метод getMetadataFor принадлежит классу Validator
и возвращает объект ClassMetadataInterface,
который содержит все ограничения (constraints),
назначенные классу и его свойствам.
Первым параметром передаётся имя класса или объект,
для которого нужно получить метаданные.
Вторым необязательным параметром можно передать
имя группы валидации.
Метод удобен, когда нужно программно
изучить, какие правила валидации
навешаны на сущность.
Синтаксис
public function getMetadataFor($value, ?array $groups = null): MetadataInterface
Пример
Давайте создадим сущность с несколькими ограничениями и получим её метаданные:
<?php
namespace AppEntity;
use SymfonyComponentValidatorConstraints as Assert;
class Article
{
#[AssertNotBlank]
#[AssertLength(min: 3, max: 100)]
private string $title;
#[AssertNotBlank]
private string $text;
#[AssertPositive]
private int $views = 0;
}
?>
Теперь получим метаданные этого класса через валидатор:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentValidatorValidation;
class ArticleController extends AbstractController
{
public function index(): Response
{
$validator = Validation::createValidator();
$metadata = $validator->getMetadataFor(Article::class);
$props = array_keys($metadata->getConstrainedProperties());
return new Response(implode(', ', $props));
}
}
?>
Результат выполнения кода:
"title, text, views"
Пример
Давайте выведем количество ограничений для конкретного свойства сущности:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentValidatorValidation;
class ArticleController extends AbstractController
{
public function index(): Response
{
$validator = Validation::createValidator();
$metadata = $validator->getMetadataFor(Article::class);
$prop = $metadata->getPropertyMetadata('title');
$count = count($prop[0]->getConstraints());
return new Response((string) $count);
}
}
?>
Результат выполнения кода:
"2"
Пример
Давайте переберём все ограничения свойства и выведем их имена классов:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentValidatorValidation;
class ArticleController extends AbstractController
{
public function index(): Response
{
$validator = Validation::createValidator();
$metadata = $validator->getMetadataFor(Article::class);
$names = [];
foreach ($metadata->getConstrainedProperties() as $property) {
foreach ($metadata->getPropertyMetadata($property) as $prop) {
foreach ($prop->getConstraints() as $constraint) {
$names[] = (new ReflectionClass($constraint))->getShortName();
}
}
}
return new Response(implode(', ', $names));
}
}
?>
Результат выполнения кода:
"NotBlank, Length, NotBlank, Positive"
Смотрите также
-
класс
Validator,
который выполняет валидацию объектов -
метод
validate,
который проверяет объект на соответствие ограничениям -
метод
validateProperty,
который валидирует отдельное свойство объекта -
метод
validatePropertyValue,
который валидирует значение для свойства объекта