You are here

class EmailValidator in Zircon Profile 8

Same name in this branch
  1. 8 vendor/symfony/validator/Constraints/EmailValidator.php \Symfony\Component\Validator\Constraints\EmailValidator
  2. 8 vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailValidator.php \Egulias\EmailValidator\EmailValidator
Same name and namespace in other branches
  1. 8.0 vendor/symfony/validator/Constraints/EmailValidator.php \Symfony\Component\Validator\Constraints\EmailValidator

@author Bernhard Schussek <bschussek@gmail.com>

Hierarchy

Expanded class hierarchy of EmailValidator

1 file declares its use of EmailValidator
EmailValidatorTest.php in vendor/symfony/validator/Tests/Constraints/EmailValidatorTest.php

File

vendor/symfony/validator/Constraints/EmailValidator.php, line 23

Namespace

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

  /**
   * @var bool
   */
  private $isStrict;
  public function __construct($strict = false) {
    $this->isStrict = $strict;
  }

  /**
   * {@inheritdoc}
   */
  public function validate($value, Constraint $constraint) {
    if (!$constraint instanceof Email) {
      throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\\Email');
    }
    if (null === $value || '' === $value) {
      return;
    }
    if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
      throw new UnexpectedTypeException($value, 'string');
    }
    $value = (string) $value;
    if (null === $constraint->strict) {
      $constraint->strict = $this->isStrict;
    }
    if ($constraint->strict) {
      if (!class_exists('\\Egulias\\EmailValidator\\EmailValidator')) {
        throw new RuntimeException('Strict email validation requires egulias/email-validator');
      }
      $strictValidator = new \Egulias\EmailValidator\EmailValidator();
      if (!$strictValidator
        ->isValid($value, false, true)) {
        if ($this->context instanceof ExecutionContextInterface) {
          $this->context
            ->buildViolation($constraint->message)
            ->setParameter('{{ value }}', $this
            ->formatValue($value))
            ->setCode(Email::INVALID_FORMAT_ERROR)
            ->addViolation();
        }
        else {
          $this
            ->buildViolation($constraint->message)
            ->setParameter('{{ value }}', $this
            ->formatValue($value))
            ->setCode(Email::INVALID_FORMAT_ERROR)
            ->addViolation();
        }
        return;
      }
    }
    elseif (!preg_match('/^.+\\@\\S+\\.\\S+$/', $value)) {
      if ($this->context instanceof ExecutionContextInterface) {
        $this->context
          ->buildViolation($constraint->message)
          ->setParameter('{{ value }}', $this
          ->formatValue($value))
          ->setCode(Email::INVALID_FORMAT_ERROR)
          ->addViolation();
      }
      else {
        $this
          ->buildViolation($constraint->message)
          ->setParameter('{{ value }}', $this
          ->formatValue($value))
          ->setCode(Email::INVALID_FORMAT_ERROR)
          ->addViolation();
      }
      return;
    }
    $host = substr($value, strpos($value, '@') + 1);

    // Check for host DNS resource records
    if ($constraint->checkMX) {
      if (!$this
        ->checkMX($host)) {
        if ($this->context instanceof ExecutionContextInterface) {
          $this->context
            ->buildViolation($constraint->message)
            ->setParameter('{{ value }}', $this
            ->formatValue($value))
            ->setCode(Email::MX_CHECK_FAILED_ERROR)
            ->addViolation();
        }
        else {
          $this
            ->buildViolation($constraint->message)
            ->setParameter('{{ value }}', $this
            ->formatValue($value))
            ->setCode(Email::MX_CHECK_FAILED_ERROR)
            ->addViolation();
        }
      }
      return;
    }
    if ($constraint->checkHost && !$this
      ->checkHost($host)) {
      if ($this->context instanceof ExecutionContextInterface) {
        $this->context
          ->buildViolation($constraint->message)
          ->setParameter('{{ value }}', $this
          ->formatValue($value))
          ->setCode(Email::HOST_CHECK_FAILED_ERROR)
          ->addViolation();
      }
      else {
        $this
          ->buildViolation($constraint->message)
          ->setParameter('{{ value }}', $this
          ->formatValue($value))
          ->setCode(Email::HOST_CHECK_FAILED_ERROR)
          ->addViolation();
      }
    }
  }

  /**
   * Check DNS Records for MX type.
   *
   * @param string $host Host
   *
   * @return bool
   */
  private function checkMX($host) {
    return checkdnsrr($host, 'MX');
  }

  /**
   * Check if one of MX, A or AAAA DNS RR exists.
   *
   * @param string $host Host
   *
   * @return bool
   */
  private function checkHost($host) {
    return $this
      ->checkMX($host) || (checkdnsrr($host, 'A') || checkdnsrr($host, 'AAAA'));
  }

}

Members

Namesort descending Modifiers Type Description Overrides
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").
EmailValidator::$isStrict private property
EmailValidator::checkHost private function Check if one of MX, A or AAAA DNS RR exists.
EmailValidator::checkMX private function Check DNS Records for MX type.
EmailValidator::validate public function Checks if the passed value is valid. Overrides ConstraintValidatorInterface::validate
EmailValidator::__construct public function