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\Context ;
use Symfony\Component\Translation\TranslatorInterface ;
use Symfony\Component\Validator\Constraint ;
use Symfony\Component\Validator\ConstraintViolation ;
use Symfony\Component\Validator\ConstraintViolationList ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\Validator\Mapping\ClassMetadataInterface ;
use Symfony\Component\Validator\Mapping\MemberMetadata ;
2015-08-17 17:00:26 -07:00
use Symfony\Component\Validator\Mapping\MetadataInterface ;
use Symfony\Component\Validator\Mapping\PropertyMetadataInterface ;
use Symfony\Component\Validator\Util\PropertyPath ;
use Symfony\Component\Validator\Validator\ValidatorInterface ;
use Symfony\Component\Validator\Violation\ConstraintViolationBuilder ;
/**
* The context used and created by { @ link ExecutionContextFactory } .
*
* @ author Bernhard Schussek < bschussek @ gmail . com >
*
* @ see ExecutionContextInterface
*
2018-11-23 12:29:20 +00:00
* @ internal since version 2.5 . Code against ExecutionContextInterface instead .
2015-08-17 17:00:26 -07:00
*/
class ExecutionContext implements ExecutionContextInterface
{
/**
* @ var ValidatorInterface
*/
private $validator ;
/**
* The root value of the validated object graph .
*
* @ var mixed
*/
private $root ;
/**
* @ var TranslatorInterface
*/
private $translator ;
/**
* @ var string
*/
private $translationDomain ;
/**
* The violations generated in the current context .
*
* @ var ConstraintViolationList
*/
private $violations ;
/**
* The currently validated value .
*
* @ var mixed
*/
private $value ;
/**
* The currently validated object .
*
* @ var object | null
*/
private $object ;
/**
* The property path leading to the current value .
*
* @ var string
*/
private $propertyPath = '' ;
/**
* The current validation metadata .
*
* @ var MetadataInterface | null
*/
private $metadata ;
/**
* The currently validated group .
*
* @ var string | null
*/
private $group ;
/**
* The currently validated constraint .
*
* @ var Constraint | null
*/
private $constraint ;
/**
* Stores which objects have been validated in which group .
*
* @ var array
*/
private $validatedObjects = array ();
/**
* Stores which class constraint has been validated for which object .
*
* @ var array
*/
private $validatedConstraints = array ();
/**
* Stores which objects have been initialized .
*
* @ var array
*/
private $initializedObjects ;
/**
* Creates a new execution context .
*
* @ param ValidatorInterface $validator The validator
* @ param mixed $root The root value of the
* validated object graph
* @ param TranslatorInterface $translator The translator
* @ param string | null $translationDomain The translation domain to
* use for translating
* violation messages
*
* @ internal Called by { @ link ExecutionContextFactory } . Should not be used
* in user code .
*/
public function __construct ( ValidatorInterface $validator , $root , TranslatorInterface $translator , $translationDomain = null )
{
$this -> validator = $validator ;
$this -> root = $root ;
$this -> translator = $translator ;
$this -> translationDomain = $translationDomain ;
$this -> violations = new ConstraintViolationList ();
}
/**
* { @ inheritdoc }
*/
public function setNode ( $value , $object , MetadataInterface $metadata = null , $propertyPath )
{
$this -> value = $value ;
$this -> object = $object ;
$this -> metadata = $metadata ;
$this -> propertyPath = ( string ) $propertyPath ;
}
/**
* { @ inheritdoc }
*/
public function setGroup ( $group )
{
$this -> group = $group ;
}
/**
* { @ inheritdoc }
*/
public function setConstraint ( Constraint $constraint )
{
$this -> constraint = $constraint ;
}
/**
* { @ inheritdoc }
*/
2018-11-23 12:29:20 +00:00
public function addViolation ( $message , array $parameters = array ())
2015-08-17 17:00:26 -07:00
{
$this -> violations -> add ( new ConstraintViolation (
$this -> translator -> trans ( $message , $parameters , $this -> translationDomain ),
$message ,
$parameters ,
$this -> root ,
$this -> propertyPath ,
$this -> value ,
null ,
null ,
$this -> constraint
));
}
/**
* { @ inheritdoc }
*/
public function buildViolation ( $message , array $parameters = array ())
{
return new ConstraintViolationBuilder (
$this -> violations ,
$this -> constraint ,
$message ,
$parameters ,
$this -> root ,
$this -> propertyPath ,
$this -> value ,
$this -> translator ,
$this -> translationDomain
);
}
/**
* { @ inheritdoc }
*/
public function getViolations ()
{
return $this -> violations ;
}
/**
* { @ inheritdoc }
*/
public function getValidator ()
{
return $this -> validator ;
}
/**
* { @ inheritdoc }
*/
public function getRoot ()
{
return $this -> root ;
}
/**
* { @ inheritdoc }
*/
public function getValue ()
{
return $this -> value ;
}
/**
* { @ inheritdoc }
*/
public function getObject ()
{
return $this -> object ;
}
/**
* { @ inheritdoc }
*/
public function getMetadata ()
{
return $this -> metadata ;
}
/**
* { @ inheritdoc }
*/
public function getGroup ()
{
return $this -> group ;
}
2017-02-02 16:28:38 -08:00
public function getConstraint ()
{
return $this -> constraint ;
}
2015-08-17 17:00:26 -07:00
/**
* { @ inheritdoc }
*/
public function getClassName ()
{
2018-11-23 12:29:20 +00:00
return $this -> metadata instanceof MemberMetadata || $this -> metadata instanceof ClassMetadataInterface ? $this -> metadata -> getClassName () : null ;
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*/
public function getPropertyName ()
{
return $this -> metadata instanceof PropertyMetadataInterface ? $this -> metadata -> getPropertyName () : null ;
}
/**
* { @ inheritdoc }
*/
public function getPropertyPath ( $subPath = '' )
{
return PropertyPath :: append ( $this -> propertyPath , $subPath );
}
/**
* { @ inheritdoc }
*/
public function markGroupAsValidated ( $cacheKey , $groupHash )
{
if ( ! isset ( $this -> validatedObjects [ $cacheKey ])) {
$this -> validatedObjects [ $cacheKey ] = array ();
}
$this -> validatedObjects [ $cacheKey ][ $groupHash ] = true ;
}
/**
* { @ inheritdoc }
*/
public function isGroupValidated ( $cacheKey , $groupHash )
{
return isset ( $this -> validatedObjects [ $cacheKey ][ $groupHash ]);
}
/**
* { @ inheritdoc }
*/
public function markConstraintAsValidated ( $cacheKey , $constraintHash )
{
$this -> validatedConstraints [ $cacheKey . ':' . $constraintHash ] = true ;
}
/**
* { @ inheritdoc }
*/
public function isConstraintValidated ( $cacheKey , $constraintHash )
{
return isset ( $this -> validatedConstraints [ $cacheKey . ':' . $constraintHash ]);
}
/**
* { @ inheritdoc }
*/
public function markObjectAsInitialized ( $cacheKey )
{
$this -> initializedObjects [ $cacheKey ] = true ;
}
/**
* { @ inheritdoc }
*/
public function isObjectInitialized ( $cacheKey )
{
return isset ( $this -> initializedObjects [ $cacheKey ]);
}
}