src/Templates/Validator/ComposedItem.phptpl
{% if onlyForDefinedValues %}
$value !== null &&
{% endif %}
(function (&$value) use (
&$modelData,
&$modifiedModelData,
&$compositionErrorCollection,
&$succeededCompositionElements,
&$validatorIndex
) {
$succeededCompositionElements = {{ availableAmount }};
$validatorComponentIndex = 0;
$originalModelData = $value;
$proposedValue = null;
$modifiedValues = [];
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
$originalPropertyValidationState = $this->_propertyValidationState ?? [];
{% endif %}
{% if generatorConfiguration.collectErrors() %}
$originalErrorRegistry = $this->_errorRegistry;
{% endif %}
{% foreach compositionProperties as compositionProperty %}
try {
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
// check if the state of the validator is already known.
// If none of the properties affected by the validator are changed the validator must not be re-evaluated
if (isset($validatorIndex) &&
isset($this->_propertyValidationState[$validatorIndex][$validatorComponentIndex]) &&
!array_intersect(
array_keys($modifiedModelData),
[
{% foreach compositionProperty.getAffectedObjectProperties() as affectedObjectProperty %}
'{{ affectedObjectProperty.getName() }}',
{% endforeach %}
]
)
) {
{% if generatorConfiguration.collectErrors() %}
$compositionErrorCollection[] = $this->_propertyValidationState[$validatorIndex][$validatorComponentIndex];
{% endif %}
if ({% if generatorConfiguration.collectErrors() %}
$this->_propertyValidationState[$validatorIndex][$validatorComponentIndex]->getErrors()
{% else %}
$this->_propertyValidationState[$validatorIndex][$validatorComponentIndex] !== true
{% endif %}
) {
throw new \Exception();
}
} else {
{% endif %}
{% if generatorConfiguration.collectErrors() %}
// collect errors for each composition element
$this->_errorRegistry = new {{ viewHelper.getSimpleClassName(generatorConfiguration.getErrorRegistryClass()) }}();
{% endif %}
{% if not postPropose %}
$proposedValue = $proposedValue ?? $value;
{% endif %}
{{ viewHelper.resolvePropertyDecorator(compositionProperty) }}
{% foreach compositionProperty.getOrderedValidators() as validator %}
{{ viewHelper.renderValidator(validator, schema) }}
{% endforeach %}
{% if generatorConfiguration.collectErrors() %}
$compositionErrorCollection[] = $this->_errorRegistry;
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
if (isset($validatorIndex)) {
$this->_propertyValidationState[$validatorIndex][$validatorComponentIndex] = $this->_errorRegistry;
}
{% endif %}
// an error inside the composed validation occurred. Throw an exception to count the validity of the
// composition item
if ($this->_errorRegistry->getErrors()) {
throw new \Exception();
}
{% endif %}
{% if postPropose %}
$proposedValue = $proposedValue ?? $value;
{% endif %}
if (is_object($value)) {
$modifiedValues = array_merge($modifiedValues, $this->{{ modifiedValuesMethod }}($originalModelData, $value));
}
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
{% if not generatorConfiguration.collectErrors() %}
if (isset($validatorIndex)) {
$this->_propertyValidationState[$validatorIndex][$validatorComponentIndex] = true;
}
{% endif %}
}
{% endif %}
} catch (\Exception $e) {
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
{% if not generatorConfiguration.collectErrors() %}
if (isset($validatorIndex)) {
$this->_propertyValidationState[$validatorIndex][$validatorComponentIndex] = false;
}
{% endif %}
{% endif %}
{% foreach compositionProperty.getAffectedObjectProperties() as affectedObjectProperty %}
$modelData['{{ affectedObjectProperty.getName() }}'] = null;
{% endforeach %}
$succeededCompositionElements--;
}
$value = $originalModelData;
$validatorComponentIndex++;
{% endforeach %}
{% if mergedProperty %}
if (is_object($proposedValue)) {
if ($modifiedValues) {
$value = array_merge($value, $modifiedValues);
}
{{ viewHelper.resolvePropertyDecorator(mergedProperty) }}
} else {
$value = $proposedValue;
}
{% else %}
$value = $proposedValue;
{% endif %}
{% if generatorConfiguration.collectErrors() %}
$this->_errorRegistry = $originalErrorRegistry;
{% endif %}
$result = !({{ composedValueValidation }});
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
if ($result) {
$this->_propertyValidationState = $originalPropertyValidationState;
}
{% endif %}
return $result;
})($value)