Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/Validator/Constraints/IssnValidator.php
Строк: 245
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentValidatorConstraints;

use 
SymfonyComponentValidatorContextExecutionContextInterface;
use 
SymfonyComponentValidatorConstraint;
use 
SymfonyComponentValidatorConstraintValidator;
use 
SymfonyComponentValidatorExceptionUnexpectedTypeException;

/**
 * Validates whether the value is a valid ISSN.
 *
 * @author Antonio J. García Lagar <aj@garcialagar.es>
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @see https://en.wikipedia.org/wiki/Issn
 */
class IssnValidator extends ConstraintValidator
{
    
/**
     * {@inheritdoc}
     */
    
public function validate($valueConstraint $constraint)
    {
        if (!
$constraint instanceof Issn) {
            throw new 
UnexpectedTypeException($constraint__NAMESPACE__.'Issn');
        }

        if (
null === $value || '' === $value) {
            return;
        }

        if (!
is_scalar($value) && !(is_object($value) && method_exists($value'__toString'))) {
            throw new 
UnexpectedTypeException($value'string');
        }

        
$value = (string) $value;
        
$canonical $value;

        
// 1234-567X
        //     ^
        
if (isset($canonical{4}) && '-' === $canonical{4}) {
            
// remove hyphen
            
$canonical substr($canonical04).substr($canonical5);
        } elseif (
$constraint->requireHyphen) {
            if (
$this->context instanceof ExecutionContextInterface) {
                
$this->context->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::MISSING_HYPHEN_ERROR)
                    ->
addViolation();
            } else {
                
$this->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::MISSING_HYPHEN_ERROR)
                    ->
addViolation();
            }

            return;
        }

        
$length strlen($canonical);

        if (
$length 8) {
            if (
$this->context instanceof ExecutionContextInterface) {
                
$this->context->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::TOO_SHORT_ERROR)
                    ->
addViolation();
            } else {
                
$this->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::TOO_SHORT_ERROR)
                    ->
addViolation();
            }

            return;
        }

        if (
$length 8) {
            if (
$this->context instanceof ExecutionContextInterface) {
                
$this->context->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::TOO_LONG_ERROR)
                    ->
addViolation();
            } else {
                
$this->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::TOO_LONG_ERROR)
                    ->
addViolation();
            }

            return;
        }

        
// 1234567X
        // ^^^^^^^ digits only
        
if (!ctype_digit(substr($canonical07))) {
            if (
$this->context instanceof ExecutionContextInterface) {
                
$this->context->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::INVALID_CHARACTERS_ERROR)
                    ->
addViolation();
            } else {
                
$this->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::INVALID_CHARACTERS_ERROR)
                    ->
addViolation();
            }

            return;
        }

        
// 1234567X
        //        ^ digit, x or X
        
if (!ctype_digit($canonical{7}) && 'x' !== $canonical{7} && 'X' !== $canonical{7}) {
            if (
$this->context instanceof ExecutionContextInterface) {
                
$this->context->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::INVALID_CHARACTERS_ERROR)
                    ->
addViolation();
            } else {
                
$this->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::INVALID_CHARACTERS_ERROR)
                    ->
addViolation();
            }

            return;
        }

        
// 1234567X
        //        ^ case-sensitive?
        
if ($constraint->caseSensitive && 'x' === $canonical{7}) {
            if (
$this->context instanceof ExecutionContextInterface) {
                
$this->context->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::INVALID_CASE_ERROR)
                    ->
addViolation();
            } else {
                
$this->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::INVALID_CASE_ERROR)
                    ->
addViolation();
            }

            return;
        }

        
// Calculate a checksum. "X" equals 10.
        
$checkSum 'X' === $canonical{7} || 'x' === $canonical{7}
            ? 
10
            
$canonical{7};

        for (
$i 0$i 7; ++$i) {
            
// Multiply the first digit by 8, the second by 7, etc.
            
$checkSum += (8-$i) * $canonical{$i};
        }

        if (
!== $checkSum 11) {
            if (
$this->context instanceof ExecutionContextInterface) {
                
$this->context->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::CHECKSUM_FAILED_ERROR)
                    ->
addViolation();
            } else {
                
$this->buildViolation($constraint->message)
                    ->
setParameter('{{ value }}'$this->formatValue($value))
                    ->
setCode(Issn::CHECKSUM_FAILED_ERROR)
                    ->
addViolation();
            }
        }
    }
}
Онлайн: 2
Реклама