8000 [DependencyInjection] Use a service locator in AddConstraintValidator… · symfony/symfony@80f9480 · GitHub
[go: up one dir, main page]

Skip to content

Commit 80f9480

Browse files
committed
[DependencyInjection] Use a service locator in AddConstraintValidatorsPass
1 parent 64ec5c5 commit 80f9480

File tree

5 files changed

+26
-27
lines changed

5 files changed

+26
-27
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddConstraintValidatorsPass.php

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111

1212
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
1313

14+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1415
use Symfony\Component\DependencyInjection\ContainerBuilder;
1516
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
16-
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
17+
use Symfony\Component\DependencyInjection\Reference;
1718

1819
class AddConstraintValidatorsPass implements CompilerPassInterface
1920
{
@@ -26,22 +27,14 @@ public function process(ContainerBuilder $container)
2627
$validators = array();
2728
foreach ($container->findTaggedServiceIds('validator.constraint_validator') as $id => $attributes) {
2829
if (isset($attributes[0]['alias'])) {
29-
$validators[$attributes[0]['alias']] = $id;
30+
$validators[$attributes[0]['alias']] = new Reference($id);
3031
}
3132

3233
$definition = $container->getDefinition($id);
33-
34-
if (!$definition->isPublic()) {
35-
throw new InvalidArgumentException(sprintf('The service "%s" must be public as it can be lazy-loaded.', $id));
36-
}
37-
38-
if ($definition->isAbstract()) {
39-
throw new InvalidArgumentException(sprintf('The service "%s" must not be abstract as it can be lazy-loaded.', $id));
40-
}
41-
42-
$validators[$definition->getClass()] = $id;
34+
$validators[$definition->getClass()] = new Reference($id);
4335
}
4436

45-
$container->getDefinition('validator.validator_factory')->replaceArgument(1, $validators);
37+
$container->getDefinition('validator.validator_factory')
38+
->replaceArgument(0, new ServiceLocatorArgument($validators));
4639
}
4740
}

src/Symfony/Bundle/FrameworkBundle/Resources/config/validator.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@
5757
</service>
5858

5959
<service id="validator.validator_factory" class="Symfony\Bundle\FrameworkBundle\Validator\ConstraintValidatorFactory" public="false">
60-
<argument type="service" id="service_container" />
61-
<argument type="collection" />
60+
<argument type="service-locator" /> <!-- Constraint validators locator -->
6261
</service>
6362

6463
<service id="validator.expression" class="Symfony\Component\Validator\Constraints\ExpressionValidator">

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConstraintValidatorsPassTest.php

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

1212
use PHPUnit\Framework\TestCase;
1313
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConstraintValidatorsPass;
14+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
15+
use Symfony\Component\DependencyInjection\Reference;
1416

1517
class AddConstraintValidatorsPassTest extends TestCase
1618
{
@@ -53,11 +55,11 @@ public function testThatConstraintValidatorServicesAreProcessed()
5355

5456
$validatorFactoryDefinition->expects($this->once())
5557
->method('replaceArgument')
56-
->with(1, array(
57-
'My\Fully\Qualified\Class\Named\Validator1' => 'my_constraint_validator_service1',
58-
'my_constraint_validator_alias1' => 'my_constraint_validator_service1',
59-
'My\Fully\Qualified\Class\Named\Validator2' => 'my_constraint_validator_service2',
60-
));
58+
->with(0, new ServiceLocatorArgument(array(
59+
'My\Fully\Qualified\Class\Named\Validator1' => new Reference('my_constraint_validator_service1'),
60+
'my_constraint_validator_alias1' => new Reference('my_constraint_validator_service1'),
61+
'My\Fully\Qualified\Class\Named\Validator2' => new Reference('my_constraint_validator_service2'),
62+
)));
6163

6264
$addConstraintValidatorsPass = new AddConstraintValidatorsPass();
6365
$addConstraintValidatorsPass->process($container);

src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace Symfony\Bundle\FrameworkBundle\Validator;
1313

14-
use Symfony\Component\DependencyInjection\ContainerInterface;
14+
use Psr\Container\ContainerInterface;
1515
use Symfony\Component\Validator\Constraint;
1616
use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
1717
use Symfony\Component\Validator\ConstraintValidatorInterface;
@@ -70,11 +70,15 @@ public function getInstance(Constraint $constraint)
7070
$name = $constraint->validatedBy();
7171

7272
if (!isset($this->validators[$name])) {
73-
if (!class_exists($name)) {
74-
throw new ValidatorException(sprintf('Constraint validator "%s" does not exist or it is not enabled. Check the "validatedBy" method in your constraint class "%s".', $name, get_class($constraint)));
75-
}
73+
if ($this->container->has($name)) {
74+
$this->validators[$name] = $this->container->get($name);
75+
} else {
76+
if (!class_exists($name)) {
77+
throw new ValidatorException(sprintf('Constraint validator "%s" does not exist or it is not enabled. Check the "validatedBy" method in your constraint class "%s".', $name, get_class($constraint)));
78+
}
7679

77-
$this->validators[$name] = new $name();
80+
$this->validators[$name] = new $name();
81+
}
7882
} elseif (is_string($this->validators[$name])) {
7983
$this->validators[$name] = $this->container->get($this->validators[$name]);
8084
}

src/Symfony/Bundle/FrameworkBundle/composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"symfony/serializer": "~3.3",
5050
"symfony/translation": "~2.8|~3.0",
5151
"symfony/templating": "~2.8|~3.0",
52-
"symfony/validator": "~3.2",
52+
"symfony/validator": "~3.3",
5353
"symfony/yaml": "~3.2",
5454
"symfony/property-info": "~3.3",
5555
"doctrine/annotations": "~1.0",
@@ -63,7 +63,8 @@
6363
"symfony/console": "<3.3",
6464
"symfony/serializer": "<3.3",
6565
"symfony/form": "<3.3",
66-
"symfony/property-info": "<3.3"
66+
"symfony/property-info": "<3.3",
67+
"symfony/validator": "<3.3"
6768
},
6869
"suggest": {
6970
"ext-apcu": "For best performance of the system caches",

0 commit comments

Comments
 (0)
0