2010-06-24 09:40:05 +01:00
< ? php
2010-10-02 11:42:31 +01:00
/*
2011-01-15 13:29:43 +00:00
* This file is part of the Symfony package .
2010-10-02 11:42:31 +01:00
*
2011-03-06 11:40:06 +00:00
* ( c ) Fabien Potencier < fabien @ symfony . com >
2010-10-02 11:42:31 +01:00
*
2011-01-15 13:29:43 +00:00
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
2010-10-02 11:42:31 +01:00
*/
2011-01-15 13:29:43 +00:00
namespace Symfony\Component\Validator\Constraints ;
2010-08-20 22:09:55 +01:00
use Symfony\Component\Validator\Constraint ;
use Symfony\Component\Validator\ConstraintValidator ;
use Symfony\Component\Validator\Exception\UnexpectedTypeException ;
2018-07-10 14:47:44 +01:00
use Symfony\Component\Validator\Exception\UnexpectedValueException ;
2010-06-24 09:40:05 +01:00
2011-07-20 09:37:57 +01:00
/**
2012-02-09 16:54:30 +00:00
* @ author Bernhard Schussek < bschussek @ gmail . com >
2011-07-20 09:37:57 +01:00
*/
2010-06-24 09:40:05 +01:00
class TimeValidator extends ConstraintValidator
{
2014-09-24 10:48:52 +01:00
const PATTERN = '/^(\d{2}):(\d{2}):(\d{2})$/' ;
/**
* Checks whether a time is valid .
*
* @ param int $hour The hour
* @ param int $minute The minute
* @ param int $second The second
*
* @ return bool Whether the time is valid
*
* @ internal
*/
public static function checkTime ( $hour , $minute , $second )
{
return $hour >= 0 && $hour < 24 && $minute >= 0 && $minute < 60 && $second >= 0 && $second < 60 ;
}
2010-06-24 09:40:05 +01:00
2011-07-20 09:37:57 +01:00
/**
2014-04-15 06:57:34 +01:00
* { @ inheritdoc }
2011-07-20 09:37:57 +01:00
*/
2012-02-09 17:02:12 +00:00
public function validate ( $value , Constraint $constraint )
2010-06-24 09:40:05 +01:00
{
2014-03-10 12:51:04 +00:00
if ( ! $constraint instanceof Time ) {
throw new UnexpectedTypeException ( $constraint , __NAMESPACE__ . '\Time' );
}
2017-11-18 12:47:08 +00:00
if ( null === $value || '' === $value ) {
return ;
}
if ( $value instanceof \DateTimeInterface ) {
@ trigger_error ( sprintf ( 'Validating a \\DateTimeInterface with "%s" is deprecated since version 4.2. Use "%s" instead or remove the constraint if the underlying model is already type hinted to \\DateTimeInterface.' , Time :: class , Type :: class ), E_USER_DEPRECATED );
2012-02-09 16:54:30 +00:00
return ;
2011-06-09 14:47:51 +01:00
}
2018-07-05 12:24:53 +01:00
if ( ! is_scalar ( $value ) && ! ( \is_object ( $value ) && method_exists ( $value , '__toString' ))) {
2018-07-10 14:47:44 +01:00
throw new UnexpectedValueException ( $value , 'string' );
2010-06-24 10:24:08 +01:00
}
2010-06-24 09:40:05 +01:00
2011-03-31 13:02:00 +01:00
$value = ( string ) $value ;
2010-06-24 09:40:05 +01:00
2014-09-24 10:48:52 +01:00
if ( ! preg_match ( static :: PATTERN , $value , $matches )) {
2016-01-14 00:18:51 +00:00
$this -> context -> buildViolation ( $constraint -> message )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $value ))
-> setCode ( Time :: INVALID_FORMAT_ERROR )
-> addViolation ();
2014-09-24 10:48:52 +01:00
return ;
}
if ( ! self :: checkTime ( $matches [ 1 ], $matches [ 2 ], $matches [ 3 ])) {
2016-01-14 00:18:51 +00:00
$this -> context -> buildViolation ( $constraint -> message )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $value ))
-> setCode ( Time :: INVALID_TIME_ERROR )
-> addViolation ();
2010-06-24 10:24:08 +01:00
}
}
2011-06-08 11:16:48 +01:00
}