From bf2b02eb1c80665c9754beeb700b773add3ca987 Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Mon, 19 Aug 2024 16:08:09 +0200 Subject: [PATCH] [DependencyInjection] Add support for `key-type` in `XmlFileLoader` --- .../DependencyInjection/CHANGELOG.md | 1 + .../Loader/XmlFileLoader.php | 15 ++++++ .../schema/dic/services/services-1.0.xsd | 9 ++++ .../Tests/Fixtures/xml/key_type_argument.xml | 12 +++++ .../Fixtures/xml/key_type_incorrect_bin.xml | 8 ++++ .../Tests/Fixtures/xml/key_type_property.xml | 12 +++++ .../Fixtures/xml/key_type_wrong_constant.xml | 10 ++++ .../Tests/Loader/XmlFileLoaderTest.php | 48 +++++++++++++++++++ 8 files changed, 115 insertions(+) create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_argument.xml create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_incorrect_bin.xml create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_property.xml create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_wrong_constant.xml diff --git a/src/Symfony/Component/DependencyInjection/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md index 3855313ccb8e8..f59ca78ef446c 100644 --- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md +++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md @@ -6,6 +6,7 @@ CHANGELOG * Deprecate `!tagged` tag, use `!tagged_iterator` instead * Add a `ContainerBuilder::registerChild()` shortcut method for registering child definitions + * Add support for `key-type` in `XmlFileLoader` 7.1 --- diff --git a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php index 661f57d21ee3f..483aa069edbcd 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php @@ -534,6 +534,21 @@ private function getArgumentsAsPhp(\DOMElement $node, string $name, string $file $key = $arg->getAttribute('key'); } + switch ($arg->getAttribute('key-type')) { + case 'binary': + if (false === $key = base64_decode($key, true)) { + throw new InvalidArgumentException(\sprintf('Tag "<%s>" with key-type="binary" does not have a valid base64 encoded key in "%s".', $name, $file)); + } + break; + case 'constant': + try { + $key = \constant(trim($key)); + } catch (\Error) { + throw new InvalidArgumentException(\sprintf('The key "%s" is not a valid constant in "%s".', $key, $file)); + } + break; + } + $trim = $arg->hasAttribute('trim') && XmlUtils::phpize($arg->getAttribute('trim')); $onInvalid = $arg->getAttribute('on-invalid'); $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; diff --git a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd index c071e3466613c..befdb658f38ef 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd +++ b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd @@ -270,6 +270,7 @@ + @@ -315,6 +316,7 @@ + @@ -365,6 +367,13 @@ + + + + + + + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_argument.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_argument.xml new file mode 100644 index 0000000000000..f95430eac0d6b --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_argument.xml @@ -0,0 +1,12 @@ + + + + + + Value 1 + Value 2 + Value 3 + + + + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_incorrect_bin.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_incorrect_bin.xml new file mode 100644 index 0000000000000..41ba1f0bc8650 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_incorrect_bin.xml @@ -0,0 +1,8 @@ + + + + + Value 3 + + + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_property.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_property.xml new file mode 100644 index 0000000000000..597d8e289fce5 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_property.xml @@ -0,0 +1,12 @@ + + + + + + Value 1 + Value 2 + Value 3 + + + + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_wrong_constant.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_wrong_constant.xml new file mode 100644 index 0000000000000..34eab6a309a42 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/key_type_wrong_constant.xml @@ -0,0 +1,10 @@ + + + + + + Value 1 + + + + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php index 11ac19595d315..e17f1a9d3d11c 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php @@ -1280,6 +1280,54 @@ public function testStaticConstructorWithFactoryThrows() $loader->load('static_constructor_and_factory.xml'); } + public function testArgumentKeyType() + { + $container = new ContainerBuilder(); + $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml')); + $loader->load('key_type_argument.xml'); + + $definition = $container->getDefinition('foo'); + $this->assertSame([ + \PHP_INT_MAX => 'Value 1', + 'PHP_INT_MAX' => 'Value 2', + "\x01\x02\x03" => 'Value 3', + ], $definition->getArgument(0)); + } + + public function testPropertyKeyType() + { + $container = new ContainerBuilder(); + $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml')); + $loader->load('key_type_property.xml'); + + $definition = $container->getDefinition('foo'); + $this->assertSame([ + \PHP_INT_MAX => 'Value 1', + 'PHP_INT_MAX' => 'Value 2', + "\x01\x02\x03" => 'Value 3', + ], $definition->getProperties()['quz']); + } + + public function testInvalidBinaryKeyType() + { + $container = new ContainerBuilder(); + $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml')); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage(\sprintf('Tag "" with key-type="binary" does not have a valid base64 encoded key in "%s".', self::$fixturesPath.'/xml/key_type_incorrect_bin.xml')); + $loader->load('key_type_incorrect_bin.xml'); + } + + public function testUnknownConstantAsKey() + { + $container = new ContainerBuilder(); + $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml')); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage(\sprintf('The key "PHP_Unknown_CONST" is not a valid constant in "%s".', self::$fixturesPath.'/xml/key_type_wrong_constant.xml')); + $loader->load('key_type_wrong_constant.xml'); + } + /** * @group legacy */ pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy