From ee4227683da8ae349573c89ba1decce6e5ef4864 Mon Sep 17 00:00:00 2001 From: Nikita Konstantinov Date: Fri, 20 Oct 2017 23:39:56 +0300 Subject: [PATCH] [DI] Add way to register service with implicit name using the PHP DSL --- .../Configurator/ContainerConfigurator.php | 3 ++- .../Configurator/ServicesConfigurator.php | 24 ++++++++++++++++--- .../Tests/Fixtures/StdClassDecorator.php | 11 +++++++++ .../Fixtures/config/anonymous.expected.yml | 19 +++++++++++++++ .../Tests/Fixtures/config/anonymous.php | 21 ++++++++++++++++ .../Tests/Loader/PhpFileLoaderTest.php | 3 ++- 6 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/StdClassDecorator.php create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.expected.yml create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.php diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php index de365fde928d4..22fc92727a993 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php @@ -31,6 +31,7 @@ class ContainerConfigurator extends AbstractConfigurator private $instanceof; private $path; private $file; + private $anonymousCount = 0; public function __construct(ContainerBuilder $container, PhpFileLoader $loader, array &$instanceof, string $path, string $file) { @@ -70,7 +71,7 @@ final public function parameters(): ParametersConfigurator final public function services(): ServicesConfigurator { - return new ServicesConfigurator($this->container, $this->loader, $this->instanceof); + return new ServicesConfigurator($this->container, $this->loader, $this->instanceof, $this->path, $this->anonymousCount); } } diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php index 686a40532f965..ce122dcec96bf 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php @@ -29,13 +29,17 @@ class ServicesConfigurator extends AbstractConfigurator private $container; private $loader; private $instanceof; + private $anonymousHash; + private $anonymousCount; - public function __construct(ContainerBuilder $container, PhpFileLoader $loader, array &$instanceof) + public function __construct(ContainerBuilder $container, PhpFileLoader $loader, array &$instanceof, string $path = null, int &$anonymousCount = 0) { $this->defaults = new Definition(); $this->container = $container; $this->loader = $loader; $this->instanceof = &$instanceof; + $this->anonymousHash = ContainerBuilder::hash($path ?: mt_rand()); + $this->anonymousCount = &$anonymousCount; $instanceof = array(); } @@ -59,14 +63,28 @@ final public function instanceof(string $fqcn): InstanceofConfigurator /** * Registers a service. + * + * @param string|null $id The service id, or null to create an anonymous service + * @param string|null $class The class of the service, or null when $id is also the class name */ - final public function set(string $id, string $class = null): ServiceConfigurator + final public function set(?string $id, string $class = null): ServiceConfigurator { $defaults = $this->defaults; $allowParent = !$defaults->getChanges() && empty($this->instanceof); $definition = new Definition(); - $definition->setPublic($defaults->isPublic()); + + if (null === $id) { + if (!$class) { + throw new \LogicException('Anonymous services must have a class name.'); + } + + $id = sprintf('%d_%s', ++$this->anonymousCount, preg_replace('/^.*\\\\/', '', $class).'~'.$this->anonymousHash); + $definition->setPublic(false); + } else { + $definition->setPublic($defaults->isPublic()); + } + $definition->setAutowired($defaults->isAutowired()); $definition->setAutoconfigured($defaults->isAutoconfigured()); $definition->setBindings($defaults->getBindings()); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/StdClassDecorator.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/StdClassDecorator.php new file mode 100644 index 0000000000000..9131c53961e2f --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/StdClassDecorator.php @@ -0,0 +1,11 @@ +foo = $foo; + } +} diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.expected.yml new file mode 100644 index 0000000000000..3f26138991021 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.expected.yml @@ -0,0 +1,19 @@ + +services: + service_container: + class: Symfony\Component\DependencyInjection\ContainerInterface + public: true + synthetic: true + listener_aggregator: + class: Bar\FooClass + public: true + arguments: [!tagged listener] + 2_stdClass~%s: + class: stdClass + public: false + tags: + - { name: listener } + decorated: + class: Symfony\Component\DependencyInjection\Tests\Fixtures\StdClassDecorator + public: true + arguments: [!service { class: stdClass, public: false }] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.php new file mode 100644 index 0000000000000..c8164d0741c7d --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.php @@ -0,0 +1,21 @@ +services(); + + $s->set('decorated', stdClass::class); + + $s->set(null, StdClassDecorator::class) + ->decorate('decorated', 'decorator42') + ->args(array(ref('decorator42'))); + + $s->set('listener_aggregator', FooClass::class)->public()->args(array(tagged('listener'))); + + $s->set(null, stdClass::class)->tag('listener'); +}; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php index 4d8f300cd9b50..f4c8d36e6249e 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php @@ -61,7 +61,7 @@ public function testConfig($file) $container->compile(); $dumper = new YamlDumper($container); - $this->assertStringEqualsFile($fixtures.'/config/'.$file.'.expected.yml', $dumper->dump()); + $this->assertStringMatchesFormatFile($fixtures.'/config/'.$file.'.expected.yml', $dumper->dump()); } public function provideConfig() @@ -72,6 +72,7 @@ public function provideConfig() yield array('prototype'); yield array('child'); yield array('php7'); + yield array('anonymous'); } /** 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