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 ;
/**
* Provides a base class for the validation of property comparisons .
*
* @ author Daniel Holmes < daniel @ danielholmes . org >
* @ author Bernhard Schussek < bschussek @ gmail . com >
*/
abstract class AbstractComparisonValidator extends ConstraintValidator
{
/**
* { @ inheritdoc }
*/
public function validate ( $value , Constraint $constraint )
{
if ( ! $constraint instanceof AbstractComparison ) {
throw new UnexpectedTypeException ( $constraint , __NAMESPACE__ . '\AbstractComparison' );
}
if ( null === $value ) {
return ;
}
$comparedValue = $constraint -> value ;
// Convert strings to DateTimes if comparing another DateTime
// This allows to compare with any date/time value supported by
// the DateTime constructor:
// http://php.net/manual/en/datetime.formats.php
if ( is_string ( $comparedValue )) {
2017-02-02 16:28:38 -08:00
if ( $value instanceof \DateTimeImmutable ) {
2015-08-17 17:00:26 -07:00
// If $value is immutable, convert the compared value to a
// DateTimeImmutable too
$comparedValue = new \DatetimeImmutable ( $comparedValue );
} elseif ( $value instanceof \DateTime || $value instanceof \DateTimeInterface ) {
// Otherwise use DateTime
$comparedValue = new \DateTime ( $comparedValue );
}
}
if ( ! $this -> compareValues ( $value , $comparedValue )) {
if ( $this -> context instanceof ExecutionContextInterface ) {
$this -> context -> buildViolation ( $constraint -> message )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $value , self :: OBJECT_TO_STRING | self :: PRETTY_DATE ))
-> setParameter ( '{{ compared_value }}' , $this -> formatValue ( $comparedValue , self :: OBJECT_TO_STRING | self :: PRETTY_DATE ))
-> setParameter ( '{{ compared_value_type }}' , $this -> formatTypeOf ( $comparedValue ))
2016-04-20 09:56:34 -07:00
-> setCode ( $this -> getErrorCode ())
2015-08-17 17:00:26 -07:00
-> addViolation ();
} else {
$this -> buildViolation ( $constraint -> message )
-> setParameter ( '{{ value }}' , $this -> formatValue ( $value , self :: OBJECT_TO_STRING | self :: PRETTY_DATE ))
-> setParameter ( '{{ compared_value }}' , $this -> formatValue ( $comparedValue , self :: OBJECT_TO_STRING | self :: PRETTY_DATE ))
-> setParameter ( '{{ compared_value_type }}' , $this -> formatTypeOf ( $comparedValue ))
2016-04-20 09:56:34 -07:00
-> setCode ( $this -> getErrorCode ())
2015-08-17 17:00:26 -07:00
-> addViolation ();
}
}
}
/**
* Compares the two given values to find if their relationship is valid .
*
* @ param mixed $value1 The first value to compare
* @ param mixed $value2 The second value to compare
*
* @ return bool true if the relationship is valid , false otherwise
*/
abstract protected function compareValues ( $value1 , $value2 );
2016-04-20 09:56:34 -07:00
/**
* Returns the error code used if the comparison fails .
*
* @ return string | null The error code or `null` if no code should be set
*/
protected function getErrorCode ()
{
}
2015-08-17 17:00:26 -07:00
}