Метод validatePropertyValue
Метод validatePropertyValue класса
Validator позволяет проверить значение
конкретного свойства без необходимости
валидировать весь объект целиком. Первым
параметром передаётся имя класса или
сущности, вторым - имя свойства, третьим -
само значение для проверки. Метод возвращает
объект ConstraintViolationList,
содержащий список найденных нарушений.
Этот метод удобен, когда нужно проверить одно поле формы, значение из API-запроса или динамически изменяемое свойство, не затрагивая остальные данные.
Синтаксис
$validator->validatePropertyValue(
string|object $objectOrClass,
string $propertyName,
mixed $value,
Constraint[]|null $groups = null
): ConstraintViolationListInterface
Пример
Давайте создадим сущность с ограничениями
и проверим значение свойства title:
<?php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Article
{
#[Assert\NotBlank]
#[Assert\Length(min: 3, max: 255)]
private string $title = '';
#[Assert\NotNull]
#[Assert\Positive]
private int $views = 0;
}
?>
Теперь проверим значение свойства title через валидатор:
<?php
namespace App\Controller;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class ArticleController extends AbstractController
{
#[Route('/article/validate', name: 'article_validate')]
public function validate(ValidatorInterface $validator): Response
{
$res = $validator->validatePropertyValue(
Article::class,
'title',
'ab'
);
if (count($res) > 0) {
return new Response((string) $res[0]->getMessage());
}
return new Response('valid');
}
}
?>
Результат выполнения кода:
"This value is too short. It should have 3 characters or more."
Пример
Давайте передадим корректное значение и убедимся, что нарушений нет:
<?php
namespace App\Controller;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class ArticleController extends AbstractController
{
#[Route('/article/validate-ok', name: 'article_validate_ok')]
public function validateOk(ValidatorInterface $validator): Response
{
$res = $validator->validatePropertyValue(
Article::class,
'title',
'article'
);
if (count($res) > 0) {
return new Response((string) $res[0]->getMessage());
}
return new Response('valid');
}
}
?>
Результат выполнения кода:
"valid"
Пример
Метод также работает с объектом, а не
только с именем класса. Давайте передадим
экземпляр сущности и проверим свойство
views:
<?php
namespace App\Controller;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class ArticleController extends AbstractController
{
#[Route('/article/validate-views', name: 'article_validate_views')]
public function validateViews(ValidatorInterface $validator): Response
{
$article = new Article();
$res = $validator->validatePropertyValue(
$article,
'views',
-5
);
if (count($res) > 0) {
return new Response((string) $res[0]->getMessage());
}
return new Response('valid');
}
}
?>
Результат выполнения кода:
"This value should be positive."
Смотрите также
-
класс
Validator,
который выполняет валидацию объектов и значений -
метод
validate,
который проверяет весь объект целиком -
метод
validateProperty,
который проверяет свойство существующего объекта -
класс
ConstraintViolationList,
который хранит список найденных нарушений