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 ;
/**
* @ author Bernhard Schussek < bschussek @ gmail . com >
*/
class LengthValidator extends ConstraintValidator
{
/**
* { @ inheritdoc }
*/
public function validate ( $value , Constraint $constraint )
{
if ( ! $constraint instanceof Length ) {
throw new UnexpectedTypeException ( $constraint , __NAMESPACE__ . '\Length' );
}
if ( null === $value || '' === $value ) {
return ;
}
if ( ! is_scalar ( $value ) && ! ( is_object ( $value ) && method_exists ( $value , '__toString' ))) {
throw new UnexpectedTypeException ( $value , 'string' );
}
$stringValue = ( string ) $value ;
$invalidCharset = false ;
if ( 'UTF8' === $charset = strtoupper ( $constraint -> charset )) {
$charset = 'UTF-8' ;
}
2015-10-08 11:40:12 -07:00
if ( 'UTF-8' === $charset ) {
if ( ! preg_match ( '//u' , $stringValue )) {
$invalidCharset = true ;
} elseif ( function_exists ( 'utf8_decode' )) {
$length = strlen ( utf8_decode ( $stringValue ));
} else {
preg_replace ( '/./u' , '' , $stringValue , - 1 , $length );
}
2015-08-17 17:00:26 -07:00
} elseif ( function_exists ( 'mb_strlen' )) {
2015-10-08 11:40:12 -07:00
if ( @ mb_check_encoding ( $stringValue , $constraint -> charset )) {
2015-08-17 17:00:26 -07:00
$length = mb_strlen ( $stringValue , $constraint -> charset );
} else {
$invalidCharset = true ;
}
2015-10-08 11:40:12 -07:00
} elseif ( function_exists ( 'iconv_strlen' )) {
$length = @ iconv_strlen ( $stringValue , $constraint -> charset );
$invalidCharset = false === $length ;
2015-08-17 17:00:26 -07:00
} else {
2015-10-08 11:40:12 -07:00
$length = strlen ( $stringValue );
2015-08-17 17:00:26 -07:00
}
if ( $invalidCharset ) {
if ( $this -> context instanceof ExecutionContextInterface ) {
$this -> context -> buildViolation ( $constraint -> charsetMessage )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $stringValue ))
-> setParameter ( '{{ charset }}' , $constraint -> charset )
-> setInvalidValue ( $value )
-> addViolation ();
} else {
$this -> buildViolation ( $constraint -> charsetMessage )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $stringValue ))
-> setParameter ( '{{ charset }}' , $constraint -> charset )
-> setInvalidValue ( $value )
-> addViolation ();
}
return ;
}
if ( null !== $constraint -> max && $length > $constraint -> max ) {
if ( $this -> context instanceof ExecutionContextInterface ) {
$this -> context -> buildViolation ( $constraint -> min == $constraint -> max ? $constraint -> exactMessage : $constraint -> maxMessage )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $stringValue ))
-> setParameter ( '{{ limit }}' , $constraint -> max )
-> setInvalidValue ( $value )
-> setPlural (( int ) $constraint -> max )
-> setCode ( Length :: TOO_LONG_ERROR )
-> addViolation ();
} else {
$this -> buildViolation ( $constraint -> min == $constraint -> max ? $constraint -> exactMessage : $constraint -> maxMessage )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $stringValue ))
-> setParameter ( '{{ limit }}' , $constraint -> max )
-> setInvalidValue ( $value )
-> setPlural (( int ) $constraint -> max )
-> setCode ( Length :: TOO_LONG_ERROR )
-> addViolation ();
}
return ;
}
if ( null !== $constraint -> min && $length < $constraint -> min ) {
if ( $this -> context instanceof ExecutionContextInterface ) {
$this -> context -> buildViolation ( $constraint -> min == $constraint -> max ? $constraint -> exactMessage : $constraint -> minMessage )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $stringValue ))
-> setParameter ( '{{ limit }}' , $constraint -> min )
-> setInvalidValue ( $value )
-> setPlural (( int ) $constraint -> min )
-> setCode ( Length :: TOO_SHORT_ERROR )
-> addViolation ();
} else {
$this -> buildViolation ( $constraint -> min == $constraint -> max ? $constraint -> exactMessage : $constraint -> minMessage )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $stringValue ))
-> setParameter ( '{{ limit }}' , $constraint -> min )
-> setInvalidValue ( $value )
-> setPlural (( int ) $constraint -> min )
-> setCode ( Length :: TOO_SHORT_ERROR )
-> addViolation ();
}
}
}
}