You are here

class ExpressionValidator in Plug 7

@author Fabien Potencier <fabien@symfony.com> @author Bernhard Schussek <bschussek@symfony.com>

Hierarchy

Expanded class hierarchy of ExpressionValidator

2 files declare their use of ExpressionValidator
ConstraintValidatorFactory.php in lib/Symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactory.php
ExpressionValidatorTest.php in lib/Symfony/validator/Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php

File

lib/Symfony/validator/Symfony/Component/Validator/Constraints/ExpressionValidator.php, line 28

Namespace

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

  /**
   * @var PropertyAccessorInterface
   */
  private $propertyAccessor;

  /**
   * @var ExpressionLanguage
   */
  private $expressionLanguage;

  /**
   * @param PropertyAccessorInterface|null $propertyAccessor Optional as of Symfony 2.5
   *
   * @throws UnexpectedTypeException If the property accessor is invalid
   */
  public function __construct($propertyAccessor = null) {
    if (null !== $propertyAccessor && !$propertyAccessor instanceof PropertyAccessorInterface) {
      throw new UnexpectedTypeException($propertyAccessor, 'null or \\Symfony\\Component\\PropertyAccess\\PropertyAccessorInterface');
    }
    $this->propertyAccessor = $propertyAccessor;
  }

  /**
   * {@inheritdoc}
   */
  public function validate($value, Constraint $constraint) {
    if (!$constraint instanceof Expression) {
      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\\Expression');
    }
    $variables = array();

    // Symfony 2.5+
    if ($this->context instanceof ExecutionContextInterface) {
      $variables['value'] = $value;
      $variables['this'] = $this->context
        ->getObject();
    }
    elseif (null === $this->context
      ->getPropertyName()) {
      $variables['value'] = $value;
      $variables['this'] = $value;
    }
    else {
      $root = $this->context
        ->getRoot();
      $variables['value'] = $value;
      if (is_object($root)) {

        // Extract the object that the property belongs to from the object
        // graph
        $path = new PropertyPath($this->context
          ->getPropertyPath());
        $parentPath = $path
          ->getParent();
        $variables['this'] = $parentPath ? $this
          ->getPropertyAccessor()
          ->getValue($root, $parentPath) : $root;
      }
      else {
        $variables['this'] = null;
      }
    }
    if (!$this
      ->getExpressionLanguage()
      ->evaluate($constraint->expression, $variables)) {
      $this
        ->buildViolation($constraint->message)
        ->setParameter('{{ value }}', $this
        ->formatValue($value))
        ->addViolation();
    }
  }
  private function getExpressionLanguage() {
    if (null === $this->expressionLanguage) {
      if (!class_exists('Symfony\\Component\\ExpressionLanguage\\ExpressionLanguage')) {
        throw new RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
      }
      $this->expressionLanguage = new ExpressionLanguage();
    }
    return $this->expressionLanguage;
  }
  private function getPropertyAccessor() {
    if (null === $this->propertyAccessor) {
      if (!class_exists('Symfony\\Component\\PropertyAccess\\PropertyAccess')) {
        throw new RuntimeException('Unable to use expressions as the Symfony PropertyAccess component is not installed.');
      }
      $this->propertyAccessor = PropertyAccess::createPropertyAccessor();
    }
    return $this->propertyAccessor;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ConstraintValidator::$context protected property
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").
ExpressionValidator::$expressionLanguage private property
ExpressionValidator::$propertyAccessor private property
ExpressionValidator::getExpressionLanguage private function
ExpressionValidator::getPropertyAccessor private function
ExpressionValidator::validate public function Checks if the passed value is valid. Overrides ConstraintValidatorInterface::validate
ExpressionValidator::__construct public function