Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Validator\Constraints; Chris@0: Chris@0: use Symfony\Component\Validator\Constraint; Chris@0: use Symfony\Component\Validator\ConstraintValidator; Chris@17: use Symfony\Component\Validator\Exception\UnexpectedTypeException; Chris@0: Chris@0: /** Chris@0: * @author Michael Hirschler Chris@0: * Chris@0: * @see https://en.wikipedia.org/wiki/ISO_9362#Structure Chris@0: */ Chris@0: class BicValidator extends ConstraintValidator Chris@0: { Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function validate($value, Constraint $constraint) Chris@0: { Chris@17: if (!$constraint instanceof Bic) { Chris@17: throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\Bic'); Chris@17: } Chris@17: Chris@0: if (null === $value || '' === $value) { Chris@0: return; Chris@0: } Chris@0: Chris@0: $canonicalize = str_replace(' ', '', $value); Chris@0: Chris@0: // the bic must be either 8 or 11 characters long Chris@17: if (!\in_array(\strlen($canonicalize), [8, 11])) { Chris@0: $this->context->buildViolation($constraint->message) Chris@0: ->setParameter('{{ value }}', $this->formatValue($value)) Chris@0: ->setCode(Bic::INVALID_LENGTH_ERROR) Chris@0: ->addViolation(); Chris@0: Chris@0: return; Chris@0: } Chris@0: Chris@0: // must contain alphanumeric values only Chris@0: if (!ctype_alnum($canonicalize)) { Chris@0: $this->context->buildViolation($constraint->message) Chris@0: ->setParameter('{{ value }}', $this->formatValue($value)) Chris@0: ->setCode(Bic::INVALID_CHARACTERS_ERROR) Chris@0: ->addViolation(); Chris@0: Chris@0: return; Chris@0: } Chris@0: Chris@0: // first 4 letters must be alphabetic (bank code) Chris@0: if (!ctype_alpha(substr($canonicalize, 0, 4))) { Chris@0: $this->context->buildViolation($constraint->message) Chris@0: ->setParameter('{{ value }}', $this->formatValue($value)) Chris@0: ->setCode(Bic::INVALID_BANK_CODE_ERROR) Chris@0: ->addViolation(); Chris@0: Chris@0: return; Chris@0: } Chris@0: Chris@0: // next 2 letters must be alphabetic (country code) Chris@0: if (!ctype_alpha(substr($canonicalize, 4, 2))) { Chris@0: $this->context->buildViolation($constraint->message) Chris@0: ->setParameter('{{ value }}', $this->formatValue($value)) Chris@0: ->setCode(Bic::INVALID_COUNTRY_CODE_ERROR) Chris@0: ->addViolation(); Chris@0: Chris@0: return; Chris@0: } Chris@0: Chris@0: // should contain uppercase characters only Chris@0: if (strtoupper($canonicalize) !== $canonicalize) { Chris@0: $this->context->buildViolation($constraint->message) Chris@0: ->setParameter('{{ value }}', $this->formatValue($value)) Chris@0: ->setCode(Bic::INVALID_CASE_ERROR) Chris@0: ->addViolation(); Chris@0: Chris@0: return; Chris@0: } Chris@0: } Chris@0: }