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 ;
2012-11-27 21:42:05 +00:00
use Symfony\Component\Translation\TranslatorInterface ;
2011-01-16 04:41:23 +00:00
/**
2012-11-22 14:58:46 +00:00
* Default implementation of { @ link ExecutionContextInterface } .
2011-01-16 04:41:23 +00:00
*
2012-01-31 20:35:48 +00:00
* This class is immutable by design .
*
2011-03-06 11:40:06 +00:00
* @ author Fabien Potencier < fabien @ symfony . com >
2012-01-31 17:42:14 +00:00
* @ author Bernhard Schussek < bschussek @ gmail . com >
2011-01-16 04:41:23 +00:00
*/
2012-11-22 14:58:46 +00:00
class ExecutionContext implements ExecutionContextInterface
2010-06-24 09:40:05 +01:00
{
2012-11-22 14:58:46 +00:00
/**
* @ var GlobalExecutionContextInterface
*/
2012-01-31 20:35:48 +00:00
private $globalContext ;
2012-11-22 14:58:46 +00:00
2012-11-27 21:42:05 +00:00
/**
* @ var TranslatorInterface
*/
private $translator ;
/**
* @ var null | string
*/
private $translationDomain ;
2012-11-22 14:58:46 +00:00
/**
* @ var MetadataInterface
*/
private $metadata ;
/**
* @ var mixed
*/
2012-01-31 20:35:48 +00:00
private $value ;
2012-11-22 14:58:46 +00:00
/**
* @ var string
*/
2012-01-31 20:35:48 +00:00
private $group ;
2012-11-22 14:58:46 +00:00
/**
* @ var string
*/
private $propertyPath ;
/**
* Creates a new execution context .
*
2012-11-27 21:42:05 +00:00
* @ param GlobalExecutionContextInterface $globalContext The global context storing node - independent state .
* @ param TranslatorInterface $translator The translator for translating violation messages .
* @ param null | string $translationDomain The domain of the validation messages .
* @ param MetadataInterface $metadata The metadata of the validated node .
* @ param mixed $value The value of the validated node .
* @ param string $group The current validation group .
* @ param string $propertyPath The property path to the current node .
2012-11-22 14:58:46 +00:00
*/
2012-11-27 21:42:05 +00:00
public function __construct ( GlobalExecutionContextInterface $globalContext , TranslatorInterface $translator , $translationDomain = null , MetadataInterface $metadata = null , $value = null , $group = null , $propertyPath = '' )
2010-06-24 10:24:08 +01:00
{
2012-11-22 14:58:46 +00:00
if ( null === $group ) {
$group = Constraint :: DEFAULT_GROUP ;
}
2012-01-31 20:35:48 +00:00
$this -> globalContext = $globalContext ;
2012-11-27 21:42:05 +00:00
$this -> translator = $translator ;
$this -> translationDomain = $translationDomain ;
2012-11-22 14:58:46 +00:00
$this -> metadata = $metadata ;
2012-01-31 20:35:48 +00:00
$this -> value = $value ;
$this -> propertyPath = $propertyPath ;
$this -> group = $group ;
2010-06-24 10:24:08 +01:00
}
2011-07-20 09:37:57 +01:00
/**
2012-11-22 14:58:46 +00:00
* { @ inheritdoc }
2011-07-20 09:37:57 +01:00
*/
2012-05-21 16:13:00 +01:00
public function addViolation ( $message , array $params = array (), $invalidValue = null , $pluralization = null , $code = null )
2010-06-24 10:24:08 +01:00
{
2012-11-22 14:58:46 +00:00
$this -> globalContext -> getViolations () -> add ( new ConstraintViolation (
2012-11-27 21:42:05 +00:00
null === $pluralization
? $this -> translator -> trans ( $message , $params , $this -> translationDomain )
: $this -> translator -> transChoice ( $message , $pluralization , $params , $this -> translationDomain ),
2010-09-24 15:34:58 +01:00
$message ,
$params ,
2012-01-31 20:35:48 +00:00
$this -> globalContext -> getRoot (),
2010-06-24 10:24:08 +01:00
$this -> propertyPath ,
2012-01-31 17:42:14 +00:00
// check using func_num_args() to allow passing null values
2012-05-03 19:43:38 +01:00
func_num_args () >= 3 ? $invalidValue : $this -> value ,
2012-05-21 16:13:00 +01:00
$pluralization ,
$code
2012-01-31 17:42:14 +00:00
));
}
2012-01-31 20:35:48 +00:00
/**
* Adds a violation at the validation graph node with the given property
* path .
*
2012-05-15 21:19:31 +01:00
* @ param string $propertyPath The property path for the violation .
* @ param string $message The error message .
* @ param array $params The parameters parsed into the error message .
* @ param mixed $invalidValue The invalid , validated value .
2012-05-01 13:46:26 +01:00
* @ param integer | null $pluralization The number to use to pluralize of the message .
2012-05-21 16:13:00 +01:00
* @ param integer | null $code The violation code .
2012-11-22 14:58:46 +00:00
*
* @ deprecated Deprecated since version 2.2 , to be removed in 2.3 .
2012-01-31 20:35:48 +00:00
*/
2012-05-21 16:13:00 +01:00
public function addViolationAtPath ( $propertyPath , $message , array $params = array (), $invalidValue = null , $pluralization = null , $code = null )
2012-01-31 17:42:14 +00:00
{
2012-12-06 20:23:28 +00:00
trigger_error ( 'addViolationAtPath() is deprecated since version 2.2 and will be removed in 2.3.' , E_USER_DEPRECATED );
2012-11-22 14:58:46 +00:00
$this -> globalContext -> getViolations () -> add ( new ConstraintViolation (
2012-11-27 21:42:05 +00:00
null === $pluralization
? $this -> translator -> trans ( $message , $params , $this -> translationDomain )
: $this -> translator -> transChoice ( $message , $pluralization , $params , $this -> translationDomain ),
2012-01-31 17:42:14 +00:00
$message ,
$params ,
2012-01-31 20:35:48 +00:00
$this -> globalContext -> getRoot (),
2012-01-31 17:42:14 +00:00
$propertyPath ,
// check using func_num_args() to allow passing null values
2012-05-03 19:43:38 +01:00
func_num_args () >= 4 ? $invalidValue : $this -> value ,
2012-05-21 16:13:00 +01:00
$pluralization ,
$code
2010-06-24 10:24:08 +01:00
));
}
2012-01-31 20:35:48 +00:00
/**
2012-02-01 12:53:45 +00:00
* Adds a violation at the validation graph node with the given property
* path relative to the current property path .
2012-01-31 20:35:48 +00:00
*
2012-05-15 21:19:31 +01:00
* @ param string $subPath The relative property path for the violation .
* @ param string $message The error message .
* @ param array $params The parameters parsed into the error message .
* @ param mixed $invalidValue The invalid , validated value .
2012-05-01 13:46:26 +01:00
* @ param integer | null $pluralization The number to use to pluralize of the message .
2012-05-21 16:13:00 +01:00
* @ param integer | null $code The violation code .
2012-11-22 14:58:46 +00:00
*
* @ deprecated Deprecated since version 2.2 , to be removed in 2.3 . Use the
2012-12-06 20:23:28 +00:00
* method { @ link addViolationAt } instead .
2012-01-31 20:35:48 +00:00
*/
2012-05-21 16:13:00 +01:00
public function addViolationAtSubPath ( $subPath , $message , array $params = array (), $invalidValue = null , $pluralization = null , $code = null )
2012-01-31 20:35:48 +00:00
{
2012-12-06 20:23:28 +00:00
trigger_error ( 'addViolationAtSubPath() is deprecated since version 2.2 and will be removed in 2.3. Use addViolationAt() instead.' , E_USER_DEPRECATED );
2012-11-22 14:58:46 +00:00
if ( func_num_args () >= 4 ) {
$this -> addViolationAt ( $subPath , $message , $params , $invalidValue , $pluralization , $code );
} else {
// Needed in order to make the check for func_num_args() inside work
$this -> addViolationAt ( $subPath , $message , $params );
}
}
/**
* { @ inheritdoc }
*/
public function addViolationAt ( $subPath , $message , array $params = array (), $invalidValue = null , $pluralization = null , $code = null )
{
$this -> globalContext -> getViolations () -> add ( new ConstraintViolation (
2012-11-27 21:42:05 +00:00
null === $pluralization
? $this -> translator -> trans ( $message , $params , $this -> translationDomain )
: $this -> translator -> transChoice ( $message , $pluralization , $params , $this -> translationDomain ),
2012-01-31 20:35:48 +00:00
$message ,
$params ,
$this -> globalContext -> getRoot (),
2012-02-02 09:13:41 +00:00
$this -> getPropertyPath ( $subPath ),
2012-01-31 20:35:48 +00:00
// check using func_num_args() to allow passing null values
2012-05-03 19:43:38 +01:00
func_num_args () >= 4 ? $invalidValue : $this -> value ,
2012-05-21 16:13:00 +01:00
$pluralization ,
$code
2012-01-31 20:35:48 +00:00
));
}
2011-01-16 04:41:23 +00:00
/**
2012-11-22 14:58:46 +00:00
* { @ inheritdoc }
2011-01-16 04:41:23 +00:00
*/
2010-06-24 10:24:08 +01:00
public function getViolations ()
{
2012-01-31 20:35:48 +00:00
return $this -> globalContext -> getViolations ();
2010-06-24 10:24:08 +01:00
}
2012-11-22 14:58:46 +00:00
/**
* { @ inheritdoc }
*/
2010-06-24 10:24:08 +01:00
public function getRoot ()
{
2012-01-31 20:35:48 +00:00
return $this -> globalContext -> getRoot ();
2010-06-24 10:24:08 +01:00
}
2012-11-22 14:58:46 +00:00
/**
* { @ inheritdoc }
*/
2012-12-03 18:34:26 +00:00
public function getPropertyPath ( $subPath = '' )
2010-06-24 10:24:08 +01:00
{
2012-12-03 18:34:26 +00:00
if ( '' != $subPath && '' !== $this -> propertyPath && '[' !== $subPath [ 0 ]) {
2012-02-02 09:13:41 +00:00
return $this -> propertyPath . '.' . $subPath ;
2012-02-01 12:53:45 +00:00
}
2012-02-02 09:13:41 +00:00
return $this -> propertyPath . $subPath ;
2012-02-01 12:53:45 +00:00
}
2012-11-22 14:58:46 +00:00
/**
* { @ inheritdoc }
*/
public function getClassName ()
2010-06-24 10:24:08 +01:00
{
2012-11-22 14:58:46 +00:00
if ( $this -> metadata instanceof ClassBasedInterface ) {
return $this -> metadata -> getClassName ();
}
return null ;
2010-06-24 10:24:08 +01:00
}
2012-11-22 14:58:46 +00:00
/**
* { @ inheritdoc }
*/
public function getPropertyName ()
2010-06-24 10:24:08 +01:00
{
2012-11-22 14:58:46 +00:00
if ( $this -> metadata instanceof PropertyMetadataInterface ) {
return $this -> metadata -> getPropertyName ();
}
return null ;
2010-06-24 10:24:08 +01:00
}
2012-11-22 14:58:46 +00:00
/**
* { @ inheritdoc }
*/
public function getValue ()
2012-01-31 17:42:14 +00:00
{
return $this -> value ;
}
2012-11-22 14:58:46 +00:00
/**
* { @ inheritdoc }
*/
2010-06-24 10:24:08 +01:00
public function getGroup ()
{
return $this -> group ;
}
2011-01-16 04:41:23 +00:00
/**
2012-11-22 14:58:46 +00:00
* { @ inheritdoc }
*/
public function getMetadata ()
{
return $this -> metadata ;
}
/**
* { @ inheritdoc }
*/
public function getMetadataFor ( $value )
{
return $this -> globalContext -> getMetadataFactory () -> getMetadataFor ( $value );
}
/**
* { @ inheritdoc }
*/
2012-12-02 10:14:14 +00:00
public function validate ( $value , $subPath = '' , $groups = null , $traverse = false , $deep = false )
2012-11-22 14:58:46 +00:00
{
$propertyPath = $this -> getPropertyPath ( $subPath );
foreach ( $this -> resolveGroups ( $groups ) as $group ) {
$this -> globalContext -> getVisitor () -> validate ( $value , $group , $propertyPath , $traverse , $deep );
}
}
/**
* { @ inheritdoc }
*/
2012-12-02 10:14:14 +00:00
public function validateValue ( $value , $constraints , $subPath = '' , $groups = null )
2012-11-22 14:58:46 +00:00
{
$constraints = is_array ( $constraints ) ? $constraints : array ( $constraints );
if ( null === $groups && '' === $subPath ) {
$context = clone $this ;
$context -> value = $value ;
$context -> executeConstraintValidators ( $value , $constraints );
return ;
}
$propertyPath = $this -> getPropertyPath ( $subPath );
foreach ( $this -> resolveGroups ( $groups ) as $group ) {
$context = clone $this ;
$context -> value = $value ;
$context -> group = $group ;
$context -> propertyPath = $propertyPath ;
$context -> executeConstraintValidators ( $value , $constraints );
}
}
/**
* Returns the class name of the current node .
*
* @ return string | null The class name or null , if the current node does not
* hold information about a class .
*
* @ see getClassName
*
* @ deprecated Deprecated since version 2.2 , to be removed in 2.3 . Use
* { @ link getClassName } instead .
*/
public function getCurrentClass ()
{
2012-12-06 20:23:28 +00:00
trigger_error ( 'getCurrentClass() is deprecated since version 2.2 and will be removed in 2.3. Use getClassName() instead' , E_USER_DEPRECATED );
2012-11-22 14:58:46 +00:00
return $this -> getClassName ();
}
/**
* Returns the property name of the current node .
*
* @ return string | null The property name or null , if the current node does
* not hold information about a property .
*
* @ see getPropertyName
*
* @ deprecated Deprecated since version 2.2 , to be removed in 2.3 . Use
* { @ link getClassName } instead .
*/
public function getCurrentProperty ()
{
2012-12-06 20:23:28 +00:00
trigger_error ( 'getCurrentProperty() is deprecated since version 2.2 and will be removed in 2.3. Use getClassName() instead' , E_USER_DEPRECATED );
2012-11-22 14:58:46 +00:00
return $this -> getPropertyName ();
}
/**
* Returns the currently validated value .
*
* @ return mixed The current value .
*
* @ see getValue
*
* @ deprecated Deprecated since version 2.2 , to be removed in 2.3 . Use
* { @ link getValue } instead .
*/
public function getCurrentValue ()
{
2012-12-06 20:23:28 +00:00
trigger_error ( 'getCurrentValue() is deprecated since version 2.2 and will be removed in 2.3. Use getValue() instead' , E_USER_DEPRECATED );
2012-11-22 14:58:46 +00:00
return $this -> value ;
}
/**
* Returns the graph walker instance .
*
* @ return GraphWalker The graph walker .
*
* @ deprecated Deprecated since version 2.2 , to be removed in 2.3 . Use
* { @ link validate } and { @ link validateValue } instead .
2011-01-16 04:41:23 +00:00
*/
2010-06-24 10:24:08 +01:00
public function getGraphWalker ()
{
2012-12-06 20:23:28 +00:00
trigger_error ( 'getGraphWalker() is deprecated since version 2.2 and will be removed in 2.3. Use validate() and validateValue() instead' , E_USER_DEPRECATED );
2012-11-22 14:58:46 +00:00
return $this -> globalContext -> getVisitor () -> getGraphWalker ();
2010-06-24 10:24:08 +01:00
}
2011-01-16 04:41:23 +00:00
/**
2012-11-22 14:58:46 +00:00
* { @ inheritdoc }
2011-01-16 04:41:23 +00:00
*/
2011-02-15 09:36:58 +00:00
public function getMetadataFactory ()
2010-06-24 10:24:08 +01:00
{
2012-01-31 20:35:48 +00:00
return $this -> globalContext -> getMetadataFactory ();
2010-06-24 10:24:08 +01:00
}
2012-11-22 14:58:46 +00:00
/**
* Executes the validators of the given constraints for the given value .
*
* @ param mixed $value The value to validate .
* @ param Constraint [] $constraints The constraints to match against .
*/
private function executeConstraintValidators ( $value , array $constraints )
{
foreach ( $constraints as $constraint ) {
$validator = $this -> globalContext -> getValidatorFactory () -> getInstance ( $constraint );
$validator -> initialize ( $this );
$validator -> validate ( $value , $constraint );
}
}
/**
* Returns an array of group names .
*
* @ param null | string | string [] $groups The groups to resolve . If a single string is
* passed , it is converted to an array . If null
* is passed , an array containing the current
* group of the context is returned .
*
* @ return array An array of validation groups .
*/
private function resolveGroups ( $groups )
{
return $groups ? ( array ) $groups : ( array ) $this -> group ;
}
2011-06-08 11:16:48 +01:00
}