You are here

class CollectionValidator in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/symfony/validator/Constraints/CollectionValidator.php \Symfony\Component\Validator\Constraints\CollectionValidator

@author Bernhard Schussek <bschussek@gmail.com>

Hierarchy

Expanded class hierarchy of CollectionValidator

1 file declares its use of CollectionValidator
CollectionValidatorTest.php in vendor/symfony/validator/Tests/Constraints/CollectionValidatorTest.php

File

vendor/symfony/validator/Constraints/CollectionValidator.php, line 22

Namespace

Symfony\Component\Validator\Constraints
View source
class CollectionValidator extends ConstraintValidator {

  /**
   * {@inheritdoc}
   */
  public function validate($value, Constraint $constraint) {
    if (!$constraint instanceof Collection) {
      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\\Collection');
    }
    if (null === $value) {
      return;
    }
    if (!is_array($value) && !($value instanceof \Traversable && $value instanceof \ArrayAccess)) {
      throw new UnexpectedTypeException($value, 'array or Traversable and ArrayAccess');
    }

    // We need to keep the initialized context when CollectionValidator
    // calls itself recursively (Collection constraints can be nested).
    // Since the context of the validator is overwritten when initialize()
    // is called for the nested constraint, the outer validator is
    // acting on the wrong context when the nested validation terminates.
    //
    // A better solution - which should be approached in Symfony 3.0 - is to
    // remove the initialize() method and pass the context as last argument
    // to validate() instead.
    $context = $this->context;
    foreach ($constraint->fields as $field => $fieldConstraint) {

      // bug fix issue #2779
      $existsInArray = is_array($value) && array_key_exists($field, $value);
      $existsInArrayAccess = $value instanceof \ArrayAccess && $value
        ->offsetExists($field);
      if ($existsInArray || $existsInArrayAccess) {
        if (count($fieldConstraint->constraints) > 0) {
          if ($context instanceof ExecutionContextInterface) {
            $context
              ->getValidator()
              ->inContext($context)
              ->atPath('[' . $field . ']')
              ->validate($value[$field], $fieldConstraint->constraints);
          }
          else {

            // 2.4 API
            $context
              ->validateValue($value[$field], $fieldConstraint->constraints, '[' . $field . ']');
          }
        }
      }
      elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) {
        if ($context instanceof ExecutionContextInterface) {
          $context
            ->buildViolation($constraint->missingFieldsMessage)
            ->atPath('[' . $field . ']')
            ->setParameter('{{ field }}', $this
            ->formatValue($field))
            ->setInvalidValue(null)
            ->setCode(Collection::MISSING_FIELD_ERROR)
            ->addViolation();
        }
        else {
          $this
            ->buildViolationInContext($context, $constraint->missingFieldsMessage)
            ->atPath('[' . $field . ']')
            ->setParameter('{{ field }}', $this
            ->formatValue($field))
            ->setInvalidValue(null)
            ->setCode(Collection::MISSING_FIELD_ERROR)
            ->addViolation();
        }
      }
    }
    if (!$constraint->allowExtraFields) {
      foreach ($value as $field => $fieldValue) {
        if (!isset($constraint->fields[$field])) {
          if ($context instanceof ExecutionContextInterface) {
            $context
              ->buildViolation($constraint->extraFieldsMessage)
              ->atPath('[' . $field . ']')
              ->setParameter('{{ field }}', $this
              ->formatValue($field))
              ->setInvalidValue($fieldValue)
              ->setCode(Collection::NO_SUCH_FIELD_ERROR)
              ->addViolation();
          }
          else {
            $this
              ->buildViolationInContext($context, $constraint->extraFieldsMessage)
              ->atPath('[' . $field . ']')
              ->setParameter('{{ field }}', $this
              ->formatValue($field))
              ->setInvalidValue($fieldValue)
              ->setCode(Collection::NO_SUCH_FIELD_ERROR)
              ->addViolation();
          }
        }
      }
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CollectionValidator::validate public function Checks if the passed value is valid. Overrides ConstraintValidatorInterface::validate
ConstraintValidator::$context protected property 3
ConstraintValidator::buildViolation Deprecated protected function Wrapper for {@link ExecutionContextInterface::buildViolation} that supports the 2.4 context API.
ConstraintValidator::buildViolationInContext Deprecated protected function Wrapper for {@link ExecutionContextInterface::buildViolation} that supports the 2.4 context API.
ConstraintValidator::formatTypeOf protected function Returns a string representation of the type of the value.
ConstraintValidator::formatValue protected function Returns a string representation of the value.
ConstraintValidator::formatValues protected function Returns a string representation of a list of values.
ConstraintValidator::initialize public function Initializes the constraint validator. Overrides ConstraintValidatorInterface::initialize 1
ConstraintValidator::OBJECT_TO_STRING constant Whether to cast objects with a "__toString()" method to strings.
ConstraintValidator::PRETTY_DATE constant Whether to format {@link \DateTime} objects as RFC-3339 dates ("Y-m-d H:i:s").