protected function validateSubdivisions($values, AddressFormat $addressFormat, $constraint)
{
$countryCode = $addressFormat->getCountryCode();
if ($addressFormat->getSubdivisionDepth() < 1) {
// No predefined subdivisions exist, nothing to validate against.
return [];
}
$subdivisionFields = $addressFormat->getUsedSubdivisionFields();
$parents = [];
$subdivisions = [];
foreach ($subdivisionFields as $index => $field) {
if (empty($values[$field]) || !in_array($field, $constraint->fields)) {
// The field is empty or validation is disabled.
break;
}
$parents[] = $index ? $values[$subdivisionFields[$index - 1]] : $countryCode;
$subdivision = $this->subdivisionRepository->get($values[$field], $parents);
if (!$subdivision) {
$this->addViolation($field, $constraint->invalidMessage, $values[$field], $addressFormat);
break;
}
$subdivisions[] = $subdivision;
if (!$subdivision->hasChildren()) {
// No predefined subdivisions below this level, stop here.
break;
}
}
return $subdivisions;
}