wol-soft/php-json-schema-model-generator

View on GitHub
src/Templates/Validator/ComposedItem.phptpl

Summary

Maintainability
Test Coverage
{% 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)