8000 [Validator] The supported API versions can now be passed to the Valid… · symfony/symfony@93fdff7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 93fdff7

Browse files
committed
[Validator] The supported API versions can now be passed to the ValidatorBuilder
1 parent 987313d commit 93fdff7

File tree

6 files changed

+173
-38
lines changed

6 files changed

+173
-38
lines changed

src/Symfony/Component/Validator/Context/LegacyExecutionContext.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ public function __construct(ValidatorInterface $validator, $root, Gr 8000 oupManagerIn
6363
/**
6464
* {@inheritdoc}
6565
*/
66-
public function addViolation($message, array $parameters = array(), $invalidValue = null, $pluralization = null, $code = null)
66+
public function addViolation($message, array $parameters = array(), $invalidValue = null, $plural = null, $code = null)
6767
{
6868
if (func_num_args() > 2) {
6969
$this
7070
->buildViolation($message, $parameters)
7171
->setInvalidValue($invalidValue)
72-
->setPluralization($pluralization)
72+
->setPlural($plural)
7373
->setCode($code)
7474
->addViolation()
7575
;
@@ -83,14 +83,14 @@ public function addViolation($message, array $parameters = array(), $invalidValu
8383
/**
8484
* {@inheritdoc}
8585
*/
86-
public function addViolationAt($subPath, $message, array $parameters = array(), $invalidValue = null, $pluralization = null, $code = null)
86+
public function addViolationAt($subPath, $message, array $parameters = array(), $invalidValue = null, $plural = null, $code = null)
8787
{
8888
if (func_num_args() > 2) {
8989
$this
9090
->buildViolation($message, $parameters)
9191
->atPath($subPath)
9292
->setInvalidValue($invalidValue)
93-
->setPluralization($pluralization)
93+
->setPlural($plural)
9494
->setCode($code)
9595
->addViolation()
9696
;

src/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
namespace Symfony\Component\Validator\Mapping;
1313

14-
use Symfony\Component\Validator\Exception\NoSuchMetadataException;
1514
use Symfony\Component\Validator\MetadataFactoryInterface;
1615

1716
/**
@@ -30,7 +29,7 @@ class BlackholeMetadataFactory implements MetadataFactoryInterface
3029
*/
3130
public function getMetadataFor($value)
3231
{
33-
throw new NoSuchMetadataException('This class does not support metadata.');
32+
throw new \LogicException('This class does not support metadata.');
3433
}
3534

3635
/**

src/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Validator\Tests;
1313

14+
use Symfony\Component\Validator\Validation;
1415
use Symfony\Component\Validator\ValidatorBuilder;
1516
use Symfony\Component\Validator\ValidatorBuilderInterface;
1617

@@ -108,4 +109,37 @@ public function testSetTranslationDomain()
108109
{
109110
$this->assertSame($this->builder, $this->builder->setTranslationDomain('TRANS_DOMAIN'));
110111
}
112+
113+
public function testDefaultApiVersion()
114+
{
115+
if (version_compare(PHP_VERSION, '5.3.9', '<')) {
116+
// Old implementation on PHP < 5.3.9
117+
$this->assertInstanceOf('Symfony\Component\Validator\Validator', $this->builder->getValidator());
118+
} else {
119+
// Legacy compatible implementation on PHP >= 5.3.9
120+
$this->assertInstanceOf('Symfony\Component\Validator\Validator\LegacyValidator', $this->builder->getValidator());
121+
}
122+
}
123+
124+
public function testSetApiVersion24()
125+
{
126+
$this->assertSame($this->builder, $this->builder->setApiVersion(Validation::API_VERSION_2_4));
127+
$this->assertInstanceOf('Symfony\Component\Validator\Validator', $this->builder->getValidator());
128+
}
129+
130+
public function testSetApiVersion25()
131+
{
132+
$this->assertSame($this->builder, $this->builder->setApiVersion(Validation::API_VERSION_2_5));
133+
$this->assertInstanceOf('Symfony\Component\Validator\Validator\Validator', $this->builder->getValidator());
134+
}
135+
136+
public function testSetApiVersion24And25()
137+
{
138+
if (version_compare(PHP_VERSION, '5.3.9', '<')) {
139+
$this->markTestSkipped('Not supported prior to PHP 5.3.9');
140+
}
141+
142+
$this->assertSame($this->builder, $this->builder->setApiVersion(Validation::API_VERSION_2_4 | Validation::API_VERSION_2_5));
143+
$this->assertInstanceOf('Symfony\Component\Validator\Validator\LegacyValidator', $this->builder->getValidator());
144+
}
111145
}

src/Symfony/Component/Validator/Validation.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@
1818
*/
1919
final class Validation
2020
{
21+
/**
22+
* The Validator API provided by Symfony 2.4 and older.
23+
*/
24+
const API_VERSION_2_4 = 1;
25+
26+
/**
27+
* The Validator API provided by Symfony 2.5 and newer.
28+
*/
29+
const API_VERSION_2_5 = 2;
30+
2131
/**
2232
* Creates a new validator.
2333
*

src/Symfony/Component/Validator/ValidatorBuilder.php

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
use Symfony\Component\PropertyAccess\PropertyAccess;
1515
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
16+
use Symfony\Component\Validator\Context\ExecutionContextFactory;
17+
use Symfony\Component\Validator\Context\LegacyExecutionContextFactory;
18+
use Symfony\Component\Validator\Exception\InvalidArgumentException;
1619
use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
1720
use Symfony\Component\Validator\Exception\ValidatorException;
1821
use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
@@ -28,6 +31,14 @@
2831
use Doctrine\Common\Annotations\AnnotationReader;
2932
use Doctrine\Common\Annotations\CachedReader;
3033
use Doctrine\Common\Cache\ArrayCache;
34+
use Symfony\Component\Validator\NodeTraverser\NonRecursiveNodeTraverser;
35+
use Symfony\Component\Validator\NodeVisitor\ContextUpdateVisitor;
36+
use Symfony\Component\Validator\NodeVisitor\DefaultGroupReplacingVisitor;
37+
use Symfony\Component\Validator\NodeVisitor\NodeValidationVisitor;
38+
use Symfony\Component\Validator\NodeVisitor\ObjectInitializationVisitor;
39+
use Symfony\Component\Validator\Validator as ValidatorV24;
40+
use Symfony\Component\Validator\Validator\Validator;
41+
use Symfony\Component\Validator\Validator\LegacyValidator;
3142

3243
/**
3344
* The default implementation of {@link ValidatorBuilderInterface}.
@@ -91,6 +102,11 @@ class ValidatorBuilder implements ValidatorBuilderInterface
91102
*/
92103
private $propertyAccessor;
93104

105+
/**
106+
* @var integer
107+
*/
108+
private $apiVersion;
109+
94110
/**
95111
* {@inheritdoc}
96112
*/
@@ -303,6 +319,32 @@ public function setPropertyAccessor(PropertyAccessorInterface $propertyAccessor)
303319
return $this;
304320
}
305321

322+
/**
323+
* {@inheritdoc}
324+
*/
325+
public function setApiVersion($apiVersion)
326+
{
327+
if (!($apiVersion & (Validation::API_VERSION_2_4 | Validation::API_VERSION_2_5))) {
328+
throw new InvalidArgumentException(sprintf(
329+
'The requested API version is invalid: "%s"',
330+
$apiVersion
331+
));
332+
}
333+
334+
if (version_compare(PHP_VERSION, '5.3.9', '<') && $apiVersion === (Validation::API_VERSION_2_4 | Validation::API_VERSION_2_5)) {
335+
throw new InvalidArgumentException(sprintf(
336+
'The Validator API that is compatible with both Symfony 2.4 '.
337+
'and Symfony 2.5 can only be used on PHP 5.3.9 and higher. '.
338+
'Your current PHP version is %s.',
339+
PHP_VERSION
340+
));
341+
}
342+
343+
$this->apiVersion = $apiVersion;
344+
345+
return $this;
346+
}
347+
306348
/**
307349
* {@inheritdoc}
308350
*/
@@ -347,7 +389,38 @@ public function getValidator()
347389
$propertyAccessor = $this->propertyAccessor ?: PropertyAccess::createPropertyAccessor();
348390
$validatorFactory = $this->validatorFactory ?: new ConstraintValidatorFactory($propertyAccessor);
349391
$translator = $this->translator ?: new DefaultTranslator();
392+
$apiVersion = $this->apiVersion;
393+
394+
if (null === $apiVersion) {
395+
$apiVersion = version_compare(PHP_VERSION, '5.3.9', '<')
396+
? Validation::API_VERSION_2_4
397+
: (Validation::API_VERSION_2_4 | Validation::API_VERSION_2_5);
398+
}
399+
400+
if (Validation::API_VERSION_2_4 === $apiVersion) {
401+
return new ValidatorV24($metadataFactory, $validatorFactory, $translator, $this->translationDomain, $this->initializers);
402+
}
403+
404+
$nodeTraverser = new NonRecursiveNodeTraverser($metadataFactory);
405+
$nodeValidator = new NodeValidationVisitor($nodeTraverser, $validatorFactory);
406+
407+
if (Validation::API_VERSION_2_5 === $apiVersion) {
408+
$contextFactory = new ExecutionContextFactory($nodeValidator, $translator, $this->translationDomain);
409+
} else {
410+
$contextFactory = new LegacyExecutionContextFactory($nodeValidator, $translator, $this->translationDomain);
411+
}
412+
413+
$nodeTraverser->addVisitor(new ContextUpdateVisitor());
414+
if (count($this->initializers) > 0) {
415+
$nodeTraverser->addVisitor(new ObjectInitializationVisitor($this->initializers));
416+
}
417+
$nodeTraverser->addVisitor(new DefaultGroupReplacingVisitor());
418+
$nodeTraverser->addVisitor($nodeValidator);
419+
420+
if (Validation::API_VERSION_2_5 === $apiVersion) {
421+
return new Validator($contextFactory, $nodeTraverser, $metadataFactory);
422+
}
350423

351-
return new Validator($metadataFactory, $validatorFactory, $translator, $this->translationDomain, $this->initializers);
424+
return new LegacyValidator($contextFactory, $nodeTraverser, $metadataFactory);
352425
}
353426
}

0 commit comments

Comments
 (0)
0