diff --git a/DependencyInjection/AddValidatorInitializersPass.php b/DependencyInjection/AddValidatorInitializersPass.php new file mode 100644 index 0000000..58cc93a --- /dev/null +++ b/DependencyInjection/AddValidatorInitializersPass.php @@ -0,0 +1,66 @@ + + * + * 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\ChildDefinition; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface; +use Symfony\Component\Validator\Util\LegacyTranslatorProxy; +/** + * @author Fabien Potencier + * @author Robin Chalas + */ +class AddValidatorInitializersPass implements CompilerPassInterface +{ + private $builderService; + private $initializerTag; + + public function __construct(string $builderService = 'validator.builder', string $initializerTag = 'validator.initializer') + { + $this->builderService = $builderService; + $this->initializerTag = $initializerTag; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->builderService)) { + return; + } + $initializers = []; + foreach ($container->findTaggedServiceIds($this->initializerTag, true) as $id => $attributes) { + $initializers[] = new Reference($id); + } + $container->getDefinition($this->builderService)->addMethodCall('addObjectInitializers', [$initializers]); + // @deprecated logic, to be removed in Symfony 5.0 + $builder = $container->getDefinition($this->builderService); + $calls = []; + foreach ($builder->getMethodCalls() as list($method, $arguments)) { + if ('setTranslator' === $method) { + if (!$arguments[0] instanceof Reference) { + $translator = $arguments[0]; + } elseif ($container->has($arguments[0])) { + $translator = $container->findDefinition($arguments[0]); + } else { + continue; + } + while (!($class = $translator->getClass()) && $translator instanceof ChildDefinition) { + $translator = $translator->getParent(); + } + if (!is_subclass_of($class, LegacyTranslatorInterface::class)) { + $arguments[0] = (new Definition(LegacyTranslatorProxy::class))->addArgument($arguments[0]); + } + } + $calls[] = [$method, $arguments]; + } + $builder->setMethodCalls($calls); + } +} diff --git a/Ressources/config/services.yaml b/Ressources/config/services.yaml index 60398d3..118830d 100644 --- a/Ressources/config/services.yaml +++ b/Ressources/config/services.yaml @@ -3,3 +3,4 @@ services: autowire: true autoconfigure: true public: false + tags: ['controller.service_arguments'] diff --git a/src/ValidatorBundle.php b/src/ValidatorBundle.php index f7cc467..e99218a 100644 --- a/src/ValidatorBundle.php +++ b/src/ValidatorBundle.php @@ -2,16 +2,13 @@ namespace Bluesquare; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Extension\Extension; -use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpKernel\Config\FileLocator; +use Symfony\Component\HttpKernel\Bundle\Bundle; use Symfony\Contracts\Translation\TranslatorInterface; use Traversable; -class ValidatorBundle extends Extension +class ValidatorBundle extends Bundle { protected $request; protected $context; @@ -444,15 +441,4 @@ class ValidatorBundle extends Extension $words = array_map('ucfirst', explode('_', $string)); return implode('', $words); } - - /** - * Loads a specific configuration. - * - * @throws \InvalidArgumentException When provided tag is not defined in this extension - */ - public function load(array $configs, ContainerBuilder $container) - { - $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '../Ressources/config')); - $loader->load('services.yaml'); - } }