Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Composite.php

function Composite::__construct

Same name in this branch
  1. 11.1.x vendor/open-telemetry/sdk/Resource/Detectors/Composite.php \OpenTelemetry\SDK\Resource\Detectors\Composite::__construct()

The groups of the composite and its nested constraints are made consistent using the following strategy:

  • If groups are passed explicitly to the composite constraint, but not to the nested constraints, the options of the composite constraint are copied to the nested constraints;
  • If groups are passed explicitly to the nested constraints, but not to the composite constraint, the groups of all nested constraints are merged and used as groups for the composite constraint;
  • If groups are passed explicitly to both the composite and its nested constraints, the groups of the nested constraints must be a subset of the groups of the composite constraint. If not, a {@link ConstraintDefinitionException} is thrown.

All this is done in the constructor, because constraints can then be cached. When constraints are loaded from the cache, no more group checks need to be done.

Overrides Constraint::__construct

12 calls to Composite::__construct()
All::__construct in vendor/symfony/validator/Constraints/All.php
All::__construct in vendor/symfony/validator/Constraints/All.php
AtLeastOneOf::__construct in vendor/symfony/validator/Constraints/AtLeastOneOf.php
AtLeastOneOf::__construct in vendor/symfony/validator/Constraints/AtLeastOneOf.php
Collection::__construct in vendor/symfony/validator/Constraints/Collection.php

... See full list

6 methods override Composite::__construct()
All::__construct in vendor/symfony/validator/Constraints/All.php
AtLeastOneOf::__construct in vendor/symfony/validator/Constraints/AtLeastOneOf.php
Collection::__construct in vendor/symfony/validator/Constraints/Collection.php
Compound::__construct in vendor/symfony/validator/Constraints/Compound.php
The groups of the composite and its nested constraints are made consistent using the following strategy:
Sequentially::__construct in vendor/symfony/validator/Constraints/Sequentially.php

... See full list

File

vendor/symfony/validator/Constraints/Composite.php, line 52

Class

Composite
A constraint that is composed of other constraints.

Namespace

Symfony\Component\Validator\Constraints

Code

public function __construct(mixed $options = null, ?array $groups = null, mixed $payload = null) {
    parent::__construct($options, $groups, $payload);
    $this->initializeNestedConstraints();
    
    /* @var Constraint[] $nestedConstraints */
    $compositeOption = $this->getCompositeOption();
    $nestedConstraints = $this->{$compositeOption};
    if (!\is_array($nestedConstraints)) {
        $nestedConstraints = [
            $nestedConstraints,
        ];
    }
    foreach ($nestedConstraints as $constraint) {
        if (!$constraint instanceof Constraint) {
            if (\is_object($constraint)) {
                $constraint = $constraint::class;
            }
            throw new ConstraintDefinitionException(\sprintf('The value "%s" is not an instance of Constraint in constraint "%s".', $constraint, static::class));
        }
        if ($constraint instanceof Valid) {
            throw new ConstraintDefinitionException(\sprintf('The constraint Valid cannot be nested inside constraint "%s". You can only declare the Valid constraint directly on a field or method.', static::class));
        }
    }
    if (!isset(((array) $this)['groups'])) {
        $mergedGroups = [];
        foreach ($nestedConstraints as $constraint) {
            foreach ($constraint->groups as $group) {
                $mergedGroups[$group] = true;
            }
        }
        // prevent empty composite constraint to have empty groups
        $this->groups = array_keys($mergedGroups) ?: [
            self::DEFAULT_GROUP,
        ];
        $this->{$compositeOption} = $nestedConstraints;
        return;
    }
    foreach ($nestedConstraints as $constraint) {
        if (isset(((array) $constraint)['groups'])) {
            $excessGroups = array_diff($constraint->groups, $this->groups);
            if (\count($excessGroups) > 0) {
                throw new ConstraintDefinitionException(\sprintf('The group(s) "%s" passed to the constraint "%s" should also be passed to its containing constraint "%s".', implode('", "', $excessGroups), get_debug_type($constraint), static::class));
            }
        }
        else {
            $constraint->groups = $this->groups;
        }
    }
    $this->{$compositeOption} = $nestedConstraints;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal