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

Breadcrumb

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

function BicValidator::validate

Overrides ConstraintValidatorInterface::validate

File

vendor/symfony/validator/Constraints/BicValidator.php, line 64

Class

BicValidator
@author Michael Hirschler <michael.vhirsch@gmail.com>

Namespace

Symfony\Component\Validator\Constraints

Code

public function validate(mixed $value, Constraint $constraint) : void {
    if (!$constraint instanceof Bic) {
        throw new UnexpectedTypeException($constraint, Bic::class);
    }
    if (null === $value || '' === $value) {
        return;
    }
    if (!\is_scalar($value) && !$value instanceof \Stringable) {
        throw new UnexpectedValueException($value, 'string');
    }
    $canonicalize = str_replace(' ', '', $value);
    // the bic must be either 8 or 11 characters long
    if (!\in_array(\strlen($canonicalize), [
        8,
        11,
    ])) {
        $this->context
            ->buildViolation($constraint->message)
            ->setParameter('{{ value }}', $this->formatValue($value))
            ->setCode(Bic::INVALID_LENGTH_ERROR)
            ->addViolation();
        return;
    }
    // must contain alphanumeric values only
    if (!ctype_alnum($canonicalize)) {
        $this->context
            ->buildViolation($constraint->message)
            ->setParameter('{{ value }}', $this->formatValue($value))
            ->setCode(Bic::INVALID_CHARACTERS_ERROR)
            ->addViolation();
        return;
    }
    $bicCountryCode = substr($canonicalize, 4, 2);
    if (Bic::VALIDATION_MODE_CASE_INSENSITIVE === $constraint->mode) {
        $bicCountryCode = strtoupper($bicCountryCode);
    }
    if (!isset(self::BIC_COUNTRY_TO_IBAN_COUNTRY_MAP[$bicCountryCode]) && !Countries::exists($bicCountryCode)) {
        $this->context
            ->buildViolation($constraint->message)
            ->setParameter('{{ value }}', $this->formatValue($value))
            ->setCode(Bic::INVALID_COUNTRY_CODE_ERROR)
            ->addViolation();
        return;
    }
    // should contain uppercase characters only in strict mode
    if (Bic::VALIDATION_MODE_STRICT === $constraint->mode && strtoupper($canonicalize) !== $canonicalize) {
        $this->context
            ->buildViolation($constraint->message)
            ->setParameter('{{ value }}', $this->formatValue($value))
            ->setCode(Bic::INVALID_CASE_ERROR)
            ->addViolation();
        return;
    }
    // check against an IBAN
    $iban = $constraint->iban;
    $path = $constraint->ibanPropertyPath;
    if ($path && null !== ($object = $this->context
        ->getObject())) {
        try {
            $iban = $this->getPropertyAccessor()
                ->getValue($object, $path);
        } catch (NoSuchPropertyException $e) {
            throw new ConstraintDefinitionException(\sprintf('Invalid property path "%s" provided to "%s" constraint: ', $path, get_debug_type($constraint)) . $e->getMessage(), 0, $e);
        } catch (UninitializedPropertyException) {
            $iban = null;
        }
    }
    if (!$iban) {
        return;
    }
    $ibanCountryCode = substr($iban, 0, 2);
    if (ctype_alpha($ibanCountryCode) && !$this->bicAndIbanCountriesMatch($bicCountryCode, $ibanCountryCode)) {
        $this->context
            ->buildViolation($constraint->ibanMessage)
            ->setParameter('{{ value }}', $this->formatValue($value))
            ->setParameter('{{ iban }}', $iban)
            ->setCode(Bic::INVALID_IBAN_COUNTRY_CODE_ERROR)
            ->addViolation();
    }
}
RSS feed
Powered by Drupal