Как получить объекты, связанные с ошибками валидации Symfony

У меня есть Entity, на котором я выполняю проверку перед сохранением в моем контроллере.

/** @var ConstraintViolationList $errors */
    $errors = $this->validator->validate($entity);

Поэтому, когда проверка не выполняется, я получаю список объектов ConstraintViolation. Как я могу получить объекты, связанные с этими ошибками? Моя цель - вернуть отображенные ошибки для каждого объекта (это выделит недопустимые элементы на стороне интерфейса).

Я буду использовать настраиваемое поле из объекта вместо идентификатора - все объекты имеют его перед сохранением в базу данных, поэтому интерфейс может их различать. Я полагаю, что мне следует написать свой собственный нормализатор ограничений, но он ничего не знает о связанных объектах для ошибок.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
444
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ConstraintViolationList ведет себя как итератор реализации ConstraintViolationInterface. Из каждого объекта ConstraintViolationInterface вы можете вызвать метод getPropertyPath, который дает вам путь свойства к недопустимому элементу корневых данных (корневые данные могут быть получены с помощью метода getRoot из любой реализации ConstraintViolationInterface.

use Symfony\Component\PropertyAccess\PropertyAccess;

// ...

foreach ($errors as $error) {
    $invalidElementAccessor = PropertyAccess::createPropertyAccessor();
    $invalidElement = $invalidElementAccessor->getValue($error->getRoot(), $error->getPropertyPath());

    // Do something with element
}

Я пропустил некоторые детали моей проблемы, но это мне тоже помогло, спасибо! Я работаю с отношением, у него есть свойство с коллекцией. Поэтому, когда я проверяю родительский объект (а не каждый объект в связанной коллекции), я не могу разделить их по нарушениям. Я сделал это по-другому - проверил каждую сущность в коллекции и заполнил объект ViolationList. После этого я добавил настраиваемый нормализатор ограничений и получил свои свойства из этих нарушений.

alvery 31.05.2018 10:03

Другие вопросы по теме