2015-08-17 17:00:26 -07:00
< ? 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 Symfony\Component\Validator\Constraints ;
use Symfony\Component\Validator\Context\ExecutionContextInterface ;
use Symfony\Component\Validator\Constraint ;
use Symfony\Component\Validator\ConstraintValidator ;
use Symfony\Component\Validator\Exception\UnexpectedTypeException ;
/**
* 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 ( $value , Constraint $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
// ^
2017-02-02 16:28:38 -08:00
if ( isset ( $canonical [ 4 ]) && '-' === $canonical [ 4 ]) {
2015-08-17 17:00:26 -07:00
// remove hyphen
$canonical = substr ( $canonical , 0 , 4 ) . substr ( $canonical , 5 );
} 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 ( $canonical , 0 , 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
// ^ digit, x or X
2017-02-02 16:28:38 -08:00
if ( ! ctype_digit ( $canonical [ 7 ]) && 'x' !== $canonical [ 7 ] && 'X' !== $canonical [ 7 ]) {
2015-08-17 17:00:26 -07:00
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?
2017-02-02 16:28:38 -08:00
if ( $constraint -> caseSensitive && 'x' === $canonical [ 7 ]) {
2015-08-17 17:00:26 -07:00
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.
2017-02-02 16:28:38 -08:00
$checkSum = 'X' === $canonical [ 7 ]
|| 'x' === $canonical [ 7 ]
2015-10-08 11:40:12 -07:00
? 10
2017-02-02 16:28:38 -08:00
: $canonical [ 7 ];
2015-08-17 17:00:26 -07:00
for ( $i = 0 ; $i < 7 ; ++ $i ) {
// Multiply the first digit by 8, the second by 7, etc.
2017-02-02 16:28:38 -08:00
$checkSum += ( 8 - $i ) * $canonical [ $i ];
2015-08-17 17:00:26 -07:00
}
if ( 0 !== $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 ();
}
}
}
}