From 0bef2339346fa5446be6a8096e5af3fe678950e9 Mon Sep 17 00:00:00 2001 From: Antonino Bertulla Date: Sat, 4 Nov 2017 16:29:23 +0100 Subject: [PATCH] Add legacy class to fix old Form compilation pass Legacy FormFactoryCompilerPass raise deprecation warnings because it extends deprecated FormPass. Fixes sonata-project/SonataAdminBundle#4700 --- .../Compiler/FormFactoryCompilerPass.php | 3 +- .../LegacyFormFactoryCompilerPass.php | 55 +++++++++++++++++++ SonataCoreBundle.php | 9 ++- 3 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 DependencyInjection/Compiler/LegacyFormFactoryCompilerPass.php diff --git a/DependencyInjection/Compiler/FormFactoryCompilerPass.php b/DependencyInjection/Compiler/FormFactoryCompilerPass.php index 8980beb2..016c9678 100644 --- a/DependencyInjection/Compiler/FormFactoryCompilerPass.php +++ b/DependencyInjection/Compiler/FormFactoryCompilerPass.php @@ -11,8 +11,8 @@ namespace Sonata\CoreBundle\DependencyInjection\Compiler; -use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\FormPass; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\Form\DependencyInjection\FormPass; class FormFactoryCompilerPass extends FormPass { @@ -42,7 +42,6 @@ public function process(ContainerBuilder $container) // get factories $original = $container->getDefinition('form.extension'); parent::process($container); - $factory = $container->getDefinition('sonata.core.form.extension.dependency'); $factory->replaceArgument(1, $original->getArgument(1)); $factory->replaceArgument(2, $original->getArgument(2)); diff --git a/DependencyInjection/Compiler/LegacyFormFactoryCompilerPass.php b/DependencyInjection/Compiler/LegacyFormFactoryCompilerPass.php new file mode 100644 index 00000000..e2a9a2ab --- /dev/null +++ b/DependencyInjection/Compiler/LegacyFormFactoryCompilerPass.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Sonata\CoreBundle\DependencyInjection\Compiler; + +use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\FormPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; + +class LegacyFormFactoryCompilerPass extends FormPass +{ + /** + * {@inheritdoc} + */ + public function process(ContainerBuilder $container) + { + $typeIdx = []; + foreach ($container->findTaggedServiceIds('form.type') as $id => $tags) { + $typeIdx[] = $id; + } + + $typeExtensionIdx = []; + foreach ($container->findTaggedServiceIds('form.type_extension') as $id => $tag) { + $typeExtensionIdx[] = $id; + } + + $container->setParameter('sonata.core.form.types', $typeIdx); + $container->setParameter('sonata.core.form.type_extensions', $typeExtensionIdx); + + // nothing to do + if (!$container->hasDefinition('sonata.core.form.extension.dependency')) { + return; + } + + // get factories + $original = $container->getDefinition('form.extension'); + parent::process($container); + $factory = $container->getDefinition('sonata.core.form.extension.dependency'); + $factory->replaceArgument(1, $original->getArgument(1)); + $factory->replaceArgument(2, $original->getArgument(2)); + $factory->replaceArgument(3, $original->getArgument(3)); + + $container->removeDefinition('form.extension'); + $container->removeDefinition('sonata.core.form.extension.dependency'); + + $container->setDefinition('form.extension', $factory); + } +} diff --git a/SonataCoreBundle.php b/SonataCoreBundle.php index 10604115..18a03f35 100644 --- a/SonataCoreBundle.php +++ b/SonataCoreBundle.php @@ -11,11 +11,12 @@ namespace Sonata\CoreBundle; +use Sonata\CoreBundle\DependencyInjection\Compiler; use Sonata\CoreBundle\DependencyInjection\Compiler\AdapterCompilerPass; -use Sonata\CoreBundle\DependencyInjection\Compiler\FormFactoryCompilerPass; use Sonata\CoreBundle\DependencyInjection\Compiler\StatusRendererCompilerPass; use Sonata\CoreBundle\Form\FormHelper; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\Form\DependencyInjection\FormPass; use Symfony\Component\HttpKernel\Bundle\Bundle; class SonataCoreBundle extends Bundle @@ -27,7 +28,11 @@ public function build(ContainerBuilder $container) { $container->addCompilerPass(new StatusRendererCompilerPass()); $container->addCompilerPass(new AdapterCompilerPass()); - $container->addCompilerPass(new FormFactoryCompilerPass()); + if (class_exists(FormPass::class)) { + $container->addCompilerPass(new Compiler\FormFactoryCompilerPass()); + } else { + $container->addCompilerPass(new Compiler\LegacyFormFactoryCompilerPass()); + } $this->registerFormMapping(); }