diff --git a/UPGRADE-3.3.md b/UPGRADE-3.3.md index a34f920857f13..bfa40d86a0f38 100644 --- a/UPGRADE-3.3.md +++ b/UPGRADE-3.3.md @@ -186,6 +186,14 @@ FrameworkBundle * The `Symfony\Bundle\FrameworkBundle\Translation\Translator` constructor now takes the default locale as 3rd argument. Not passing it will trigger an error in 4.0. + * The `Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddValidatorInitializersPass` + class has been deprecated and will be removed in 4.0. + Use the `Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass` class instead. + + * The `Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConstraintValidatorsPass` + class has been deprecated and will be removed in 4.0. + Use the `Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass` class instead. + HttpFoundation -------------- diff --git a/UPGRADE-4.0.md b/UPGRADE-4.0.md index 65b0ae75d6278..0987f4dba9185 100644 --- a/UPGRADE-4.0.md +++ b/UPGRADE-4.0.md @@ -279,8 +279,13 @@ FrameworkBundle * The `Symfony\Bundle\FrameworkBundle\Translation\Translator` constructor now takes the default locale as mandatory 3rd argument. -HttpFoundation ---------------- + * The `Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddValidatorInitializersPass` class has been + removed. Use the `Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass` + class instead. + + * The `Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConstraintValidatorsPass` class has been + removed. Use the `Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass` + class instead. HttpFoundation -------------- diff --git a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md index 2c73aad5ddb9f..b010255835428 100644 --- a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md +++ b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md @@ -40,6 +40,10 @@ CHANGELOG making `Translator` works with any PSR-11 container * Added `framework.serializer.mapping` config option allowing to define custom serialization mapping files and directories + * Deprecated `AddValidatorInitializersPass`, use + `Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass` instead + * Deprecated `AddConstraintValidatorsPass`, use + `Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass` instead 3.2.0 ----- diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddConstraintValidatorsPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddConstraintValidatorsPass.php index 69839964856b1..3b89fa2651a80 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddConstraintValidatorsPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddConstraintValidatorsPass.php @@ -11,36 +11,13 @@ namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler; -use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\ServiceLocator; +use Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass as BaseAddConstraintValidatorsPass; -class AddConstraintValidatorsPass implements CompilerPassInterface -{ - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition('validator.validator_factory')) { - return; - } - - $validators = array(); - foreach ($container->findTaggedServiceIds('validator.constraint_validator') as $id => $attributes) { - $definition = $container->getDefinition($id); - - if ($definition->isAbstract()) { - continue; - } - - if (isset($attributes[0]['alias'])) { - $validators[$attributes[0]['alias']] = new ServiceClosureArgument(new Reference($id)); - } +@trigger_error(sprintf('The %s class is deprecated since version 3.3 and will be removed in 4.0. Use %s instead.', AddConstraintValidatorsPass::class, BaseAddConstraintValidatorsPass::class), E_USER_DEPRECATED); - $validators[$definition->getClass()] = new ServiceClosureArgument(new Reference($id)); - } - - $container->getDefinition('validator.validator_factory')->replaceArgument(0, (new Definition(ServiceLocator::class, array($validators)))->addTag('container.service_locator')); - } +/** + * @deprecated since version 3.3, to be removed in 4.0. Use {@link BaseAddConstraintValidatorsPass} instead + */ +class AddConstraintValidatorsPass extends BaseAddConstraintValidatorsPass +{ } diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddValidatorInitializersPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddValidatorInitializersPass.php index 6f58fc21bebf1..d71d87c1faad4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddValidatorInitializersPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddValidatorInitializersPass.php @@ -11,25 +11,13 @@ namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass as BaseAddValidatorsInitializerPass; -class AddValidatorInitializersPass implements CompilerPassInterface -{ - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition('validator.builder')) { - return; - } - - $validatorBuilder = $container->getDefinition('validator.builder'); - - $initializers = array(); - foreach ($container->findTaggedServiceIds('validator.initializer') as $id => $attributes) { - $initializers[] = new Reference($id); - } +@trigger_error(sprintf('The %s class is deprecated since version 3.3 and will be removed in 4.0. Use %s instead.', AddValidatorInitializersPass::class, BaseAddValidatorsInitializerPass::class), E_USER_DEPRECATED); - $validatorBuilder->addMethodCall('addObjectInitializers', array($initializers)); - } +/** + * @deprecated since version 3.3, to be removed in 4.0. Use {@link BaseAddValidatorInitializersPass} instead + */ +class AddValidatorInitializersPass extends BaseAddValidatorsInitializerPass +{ } diff --git a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php index fde898503b507..c2b0a5f7ad186 100644 --- a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php +++ b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php @@ -12,9 +12,7 @@ namespace Symfony\Bundle\FrameworkBundle; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddAnnotationsCachedReaderPass; -use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConstraintValidatorsPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddDebugLogProcessorPass; -use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddValidatorInitializersPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\CacheCollectorPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\CachePoolPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\CachePoolClearerPass; @@ -47,6 +45,8 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Bundle\Bundle; use Symfony\Component\Config\Resource\ClassExistenceResource; +use Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass; +use Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass; /** * Bundle. @@ -84,9 +84,9 @@ public function build(ContainerBuilder $container) // but as late as possible to get resolved parameters $container->addCompilerPass(new RegisterListenersPass(), PassConfig::TYPE_BEFORE_REMOVING); $container->addCompilerPass(new TemplatingPass()); - $container->addCompilerPass(new AddConstraintValidatorsPass(), PassConfig::TYPE_BEFORE_REMOVING); + $this->addCompilerPassIfExists($container, AddConstraintValidatorsPass::class, PassConfig::TYPE_BEFORE_REMOVING); $container->addCompilerPass(new AddAnnotationsCachedReaderPass(), PassConfig::TYPE_BEFORE_REMOVING); - $container->addCompilerPass(new AddValidatorInitializersPass()); + $this->addCompilerPassIfExists($container, AddValidatorInitializersPass::class); $this->addCompilerPassIfExists($container, AddConsoleCommandPass::class); $container->addCompilerPass(new TranslatorPass()); $container->addCompilerPass(new LoggingTranslatorPass()); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConstraintValidatorsPassTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConstraintValidatorsPassTest.php index 9a3a12dd50d29..ce12121bb09f4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConstraintValidatorsPassTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConstraintValidatorsPassTest.php @@ -19,6 +19,9 @@ use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\ServiceLocator; +/** + * @group legacy + */ class AddConstraintValidatorsPassTest extends TestCase { public function testThatConstraintValidatorServicesAreProcessed() diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index 53ff5e54bea16..e3956b1fb576d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -16,7 +16,6 @@ use Symfony\Bundle\FullStack; use Symfony\Bundle\FrameworkBundle\Tests\TestCase; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddAnnotationsCachedReaderPass; -use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConstraintValidatorsPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension; use Symfony\Component\Cache\Adapter\AdapterInterface; use Symfony\Component\Cache\Adapter\ApcuAdapter; @@ -41,6 +40,7 @@ use Symfony\Component\Serializer\Normalizer\DataUriNormalizer; use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; use Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer; +use Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass; abstract class FrameworkExtensionTest extends TestCase { diff --git a/src/Symfony/Component/Validator/CHANGELOG.md b/src/Symfony/Component/Validator/CHANGELOG.md index 78a5ad150be3c..7099496cfa1d2 100644 --- a/src/Symfony/Component/Validator/CHANGELOG.md +++ b/src/Symfony/Component/Validator/CHANGELOG.md @@ -1,6 +1,12 @@ CHANGELOG ========= +3.3.0 +----- + + * added `AddValidatorInitializersPass` + * added `AddConstraintValidatorsPass` + 3.2.0 ----- diff --git a/src/Symfony/Component/Validator/DependencyInjection/AddConstraintValidatorsPass.php b/src/Symfony/Component/Validator/DependencyInjection/AddConstraintValidatorsPass.php new file mode 100644 index 0000000000000..eaff6effe0171 --- /dev/null +++ b/src/Symfony/Component/Validator/DependencyInjection/AddConstraintValidatorsPass.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Validator\DependencyInjection; + +use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\ServiceLocator; + +/** + * @author Johannes M. Schmitt + * @author Robin Chalas + */ +class AddConstraintValidatorsPass implements CompilerPassInterface +{ + private $validatorFactoryServiceId; + private $constraintValidatorTag; + + public function __construct($validatorFactoryServiceId = 'validator.validator_factory', $constraintValidatorTag = 'validator.constraint_validator') + { + $this->validatorFactoryServiceId = $validatorFactoryServiceId; + $this->constraintValidatorTag = $constraintValidatorTag; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->validatorFactoryServiceId)) { + return; + } + + $validators = array(); + foreach ($container->findTaggedServiceIds($this->constraintValidatorTag) as $id => $attributes) { + $definition = $container->getDefinition($id); + + if ($definition->isAbstract()) { + continue; + } + + if (isset($attributes[0]['alias'])) { + $validators[$attributes[0]['alias']] = new ServiceClosureArgument(new Reference($id)); + } + + $validators[$definition->getClass()] = new ServiceClosureArgument(new Reference($id)); + } + + $container + ->getDefinition('validator.validator_factory') + ->replaceArgument(0, (new Definition(ServiceLocator::class, array($validators)))->addTag('container.service_locator')) + ; + } +} diff --git a/src/Symfony/Component/Validator/DependencyInjection/AddValidatorInitializersPass.php b/src/Symfony/Component/Validator/DependencyInjection/AddValidatorInitializersPass.php new file mode 100644 index 0000000000000..627b410ce00fa --- /dev/null +++ b/src/Symfony/Component/Validator/DependencyInjection/AddValidatorInitializersPass.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Validator\DependencyInjection; + +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; + +/** + * @author Fabien Potencier + * @author Robin Chalas + */ +class AddValidatorInitializersPass implements CompilerPassInterface +{ + private $builderService; + private $initializerTag; + + public function __construct($builderService = 'validator.builder', $initializerTag = 'validator.initializer') + { + $this->builderService = $builderService; + $this->initializerTag = $initializerTag; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->builderService)) { + return; + } + + $initializers = array(); + foreach ($container->findTaggedServiceIds($this->initializerTag) as $id => $attributes) { + if ($container->getDefinition($id)->isAbstract()) { + continue; + } + + $initializers[] = new Reference($id); + } + + $container->getDefinition($this->builderService)->addMethodCall('addObjectInitializers', array($initializers)); + } +} diff --git a/src/Symfony/Component/Validator/Tests/DependencyInjection/AddConstraintValidatorsPassTest.php b/src/Symfony/Component/Validator/Tests/DependencyInjection/AddConstraintValidatorsPassTest.php new file mode 100644 index 0000000000000..ed2f59c52903c --- /dev/null +++ b/src/Symfony/Component/Validator/Tests/DependencyInjection/AddConstraintValidatorsPassTest.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Validator\Tests\DependencyInjection; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass; +use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\ServiceLocator; + +class AddConstraintValidatorsPassTest extends TestCase +{ + public function testThatConstraintValidatorServicesAreProcessed() + { + $container = new ContainerBuilder(); + $validatorFactory = $container->register('validator.validator_factory') + ->addArgument(array()); + + $container->register('my_constraint_validator_service1', Validator1::class) + ->addTag('validator.constraint_validator', array('alias' => 'my_constraint_validator_alias1')); + $container->register('my_constraint_validator_service2', Validator2::class) + ->addTag('validator.constraint_validator'); + $container->register('my_abstract_constraint_validator') + ->setAbstract(true) + ->addTag('validator.constraint_validator'); + + $addConstraintValidatorsPass = new AddConstraintValidatorsPass(); + $addConstraintValidatorsPass->process($container); + + $this->assertEquals((new Definition(ServiceLocator::class, array(array( + Validator1::class => new ServiceClosureArgument(new Reference('my_constraint_validator_service1')), + 'my_constraint_validator_alias1' => new ServiceClosureArgument(new Reference('my_constraint_validator_service1')), + Validator2::class => new ServiceClosureArgument(new Reference('my_constraint_validator_service2')), + ))))->addTag('container.service_locator'), $validatorFactory->getArgument(0)); + } + + public function testThatCompilerPassIsIgnoredIfThereIsNoConstraintValidatorFactoryDefinition() + { + $definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock(); + $container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition'))->getMock(); + + $container->expects($this->never())->method('findTaggedServiceIds'); + $container->expects($this->never())->method('getDefinition'); + $container->expects($this->atLeastOnce()) + ->method('hasDefinition') + ->with('validator.validator_factory') + ->will($this->returnValue(false)); + $definition->expects($this->never())->method('replaceArgument'); + + $addConstraintValidatorsPass = new AddConstraintValidatorsPass(); + $addConstraintValidatorsPass->process($container); + } +} diff --git a/src/Symfony/Component/Validator/Tests/DependencyInjection/AddValidatorInitializersPassTest.php b/src/Symfony/Component/Validator/Tests/DependencyInjection/AddValidatorInitializersPassTest.php new file mode 100644 index 0000000000000..61c13d25e75d9 --- /dev/null +++ b/src/Symfony/Component/Validator/Tests/DependencyInjection/AddValidatorInitializersPassTest.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Validator\Tests\DependencyInjection; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass; + +class AddValidatorInitializersPassTest extends TestCase +{ + public function testProcess() + { + $container = new ContainerBuilder(); + $container + ->register('initializer1') + ->addTag('validator.initializer') + ; + $container + ->register('initializer2') + ->addTag('validator.initializer') + ; + $container + ->register('validator.builder') + ->addArgument(array()) + ; + + (new AddValidatorInitializersPass())->process($container); + + $this->assertEquals( + array(array('addObjectInitializers', array(array(new Reference('initializer1'), new Reference('initializer2'))))), + $container->getDefinition('validator.builder')->getMethodCalls() + ); + } +} diff --git a/src/Symfony/Component/Validator/composer.json b/src/Symfony/Component/Validator/composer.json index 41bc4d8ab1c14..7c7214b54878a 100644 --- a/src/Symfony/Component/Validator/composer.json +++ b/src/Symfony/Component/Validator/composer.json @@ -25,6 +25,7 @@ "symfony/intl": "^2.8.18|^3.2.5", "symfony/yaml": "~3.3", "symfony/config": "~2.8|~3.0", + "symfony/dependency-injection": "~3.3", "symfony/expression-language": "~2.8|~3.0", "symfony/cache": "~3.1", "doctrine/annotations": "~1.0", @@ -33,6 +34,7 @@ }, "conflict": { "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.3", "symfony/yaml": "<3.3" }, "suggest": {