/** * @param ExecutionContextInterface $context * @param AttributeInterface $attribute * @param DataInterface $data * * @throws Exception */ protected function validateRules(ExecutionContextInterface $context, AttributeInterface $attribute, DataInterface $data) { if ($attribute->isMultiple()) { $valueData = $data->getValuesData($attribute); } else { $valueData = $data->getValueData($attribute); } $loader = new BaseLoader(); foreach ($attribute->getValidationRules() as $validationRule) { foreach ($validationRule as $item => $options) { $constraint = $loader->newConstraint($item, $options); $violations = $context->getValidator()->validate($valueData, $constraint, $context->getGroup()); /** @var ConstraintViolationInterface $violation */ foreach ($violations as $violation) { /** @noinspection DisconnectedForeachInstructionInspection */ $path = $attribute->getCode(); if ($attribute->getType()->isEmbedded()) { if (!$attribute->isMultiple()) { $path .= '.'; } $path .= $violation->getPropertyPath(); } if ($violation->getMessage()) { $context->buildViolation($violation->getMessage())->atPath($path)->setInvalidValue($valueData)->addViolation(); } else { $this->buildAttributeViolation($context, $attribute, strtolower($item), $valueData, $path); } } } } }