diff --git a/UPGRADE-3.3.md b/UPGRADE-3.3.md index ae1985740f39..3734fff5e29a 100644 --- a/UPGRADE-3.3.md +++ b/UPGRADE-3.3.md @@ -244,6 +244,10 @@ FrameworkBundle class has been deprecated and will be removed in 4.0. Use the `Symfony\Component\Workflow\DependencyInjection\ValidateWorkflowsPass` class instead. + * Passing an array of validators or validator aliases as the second argument of + `ConstraintValidatorFactory::__construct()` is deprecated since 3.3 and will + be removed in 4.0. Use the service locator instead. + HttpFoundation -------------- diff --git a/UPGRADE-4.0.md b/UPGRADE-4.0.md index 4b040fd20318..0f89d2b3b791 100644 --- a/UPGRADE-4.0.md +++ b/UPGRADE-4.0.md @@ -299,6 +299,10 @@ FrameworkBundle * Extending `ConstraintValidatorFactory` is not supported anymore. + * Passing an array of validators or validator aliases as the second argument of + `ConstraintValidatorFactory::__construct()` has been removed. + Use the service locator instead. + * Class parameters related to routing have been removed * router.options.generator_class * router.options.generator_base_class diff --git a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md index df80163243c1..b7473b58129b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md +++ b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md @@ -49,6 +49,7 @@ CHANGELOG `Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass` instead * Deprecated `ValidateWorkflowsPass`, use `Symfony\Component\Workflow\DependencyInjection\ValidateWorkflowsPass` instead + * Deprecated `ConstraintValidatorFactory::__construct()` second argument. 3.2.0 ----- diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Validator/ConstraintValidatorFactoryTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Validator/ConstraintValidatorFactoryTest.php index 6cf9574ece96..38a1190aded7 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Validator/ConstraintValidatorFactoryTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Validator/ConstraintValidatorFactoryTest.php @@ -14,7 +14,10 @@ use PHPUnit\Framework\TestCase; use Symfony\Bundle\FrameworkBundle\Validator\ConstraintValidatorFactory; use Symfony\Component\DependencyInjection\Container; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraints\Blank as BlankConstraint; +use Symfony\Component\Validator\ConstraintValidator; class ConstraintValidatorFactoryTest extends TestCase { @@ -41,6 +44,38 @@ public function testGetInstanceReturnsExistingValidator() } public function testGetInstanceReturnsService() + { + $service = 'validator_constraint_service'; + $validator = $this->getMockForAbstractClass(ConstraintValidator::class); + + // mock ContainerBuilder b/c it implements TaggedContainerInterface + $container = $this->getMockBuilder(ContainerBuilder::class)->setMethods(array('get', 'has'))->getMock(); + $container + ->expects($this->once()) + ->method('get') + ->with($service) + ->willReturn($validator); + $container + ->expects($this->once()) + ->method('has') + ->with($service) + ->willReturn(true); + + $constraint = $this->getMockBuilder(Constraint::class)->getMock(); + $constraint + ->expects($this->once()) + ->method('validatedBy') + ->will($this->returnValue($service)); + + $factory = new ConstraintValidatorFactory($container); + $this->assertSame($validator, $factory->getInstance($constraint)); + } + + /** + * @group legacy + * @expectedDeprecation Passing an array of validators or validator aliases as the second argument of "Symfony\Bundle\FrameworkBundle\Validator\ConstraintValidatorFactory::__construct" is deprecated since 3.3 and will be removed in 4.0. Use the service locator instead. + */ + public function testGetInstanceReturnsServiceWithAlias() { $service = 'validator_constraint_service'; $alias = 'validator_constraint_alias'; diff --git a/src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php b/src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php index aba02e0944e2..49cd5fe1138c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php +++ b/src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php @@ -45,15 +45,16 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface protected $container; protected $validators; - /** - * Constructor. - * - * @param ContainerInterface $container The service container - * @param array $validators An array of validators - */ - public function __construct(ContainerInterface $container, array $validators = array()) + public function __construct(ContainerInterface $container, array $validators = null) { $this->container = $container; + + if (null !== $validators) { + @trigger_error(sprintf('Passing an array of validators or validator aliases as the second argument of "%s" is deprecated since 3.3 and will be removed in 4.0. Use the service locator instead.', __METHOD__), E_USER_DEPRECATED); + } else { + $validators = array(); + } + $this->validators = $validators; } @@ -82,6 +83,7 @@ public function getInstance(Constraint $constraint) $this->validators[$name] = new $name(); } } elseif (is_string($this->validators[$name])) { + // To be removed in 4.0 $this->validators[$name] = $this->container->get($this->validators[$name]); }