У меня есть Entity, на котором я выполняю проверку перед сохранением в моем контроллере.
/** @var ConstraintViolationList $errors */
$errors = $this->validator->validate($entity);
Поэтому, когда проверка не выполняется, я получаю список объектов ConstraintViolation.
Как я могу получить объекты, связанные с этими ошибками? Моя цель - вернуть отображенные ошибки для каждого объекта (это выделит недопустимые элементы на стороне интерфейса).
Я буду использовать настраиваемое поле из объекта вместо идентификатора - все объекты имеют его перед сохранением в базу данных, поэтому интерфейс может их различать. Я полагаю, что мне следует написать свой собственный нормализатор ограничений, но он ничего не знает о связанных объектах для ошибок.






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. После этого я добавил настраиваемый нормализатор ограничений и получил свои свойства из этих нарушений.