From 51e0d3792caa7c53860b2c54bf2c949ddae8c7cd Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 13 Apr 2020 11:14:49 +0200 Subject: [PATCH] [DI] fix loading defaults when using the PHP-DSL --- .../Compiler/CacheCollectorPass.php | 4 +++- .../Loader/Configurator/PrototypeConfigurator.php | 7 +++++-- .../Loader/Configurator/ServicesConfigurator.php | 12 +++++++++--- .../Tests/Fixtures/config/basic.expected.yml | 1 - .../Tests/Fixtures/config/child.expected.yml | 5 +---- .../Tests/Fixtures/config/defaults.expected.yml | 1 - .../Tests/Fixtures/config/instanceof.expected.yml | 2 -- .../Tests/Fixtures/config/php7.expected.yml | 1 - .../Tests/Fixtures/config/prototype.expected.yml | 2 -- .../Tests/Fixtures/config/services9.php | 3 +-- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CacheCollectorPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CacheCollectorPass.php index 7f8494d98e0ad..6bb614489eeb8 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CacheCollectorPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CacheCollectorPass.php @@ -44,7 +44,9 @@ public function process(ContainerBuilder $container) $recorder = new Definition(is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class); $recorder->setTags($definition->getTags()); - $recorder->setPublic($definition->isPublic()); + if (!$definition->isPublic() || !$definition->isPrivate()) { + $recorder->setPublic($definition->isPublic()); + } $recorder->setArguments([new Reference($innerId = $id.'.recorder_inner')]); $definition->setTags([]); diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/PrototypeConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/PrototypeConfigurator.php index d80c8b13389f2..3d844798d431a 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/PrototypeConfigurator.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/PrototypeConfigurator.php @@ -45,10 +45,13 @@ class PrototypeConfigurator extends AbstractServiceConfigurator public function __construct(ServicesConfigurator $parent, PhpFileLoader $loader, Definition $defaults, $namespace, $resource, $allowParent) { $definition = new Definition(); - $definition->setPublic($defaults->isPublic()); + if (!$defaults->isPublic() || !$defaults->isPrivate()) { + $definition->setPublic($defaults->isPublic()); + } $definition->setAutowired($defaults->isAutowired()); $definition->setAutoconfigured($defaults->isAutoconfigured()); - $definition->setBindings($defaults->getBindings()); + // deep clone, to avoid multiple process of the same instance in the passes + $definition->setBindings(unserialize(serialize($defaults->getBindings()))); $definition->setChanges([]); $this->loader = $loader; diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php index e7677eb5e6dc6..b6ccbc63b4e81 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php @@ -79,10 +79,13 @@ final public function set($id, $class = null) $allowParent = !$defaults->getChanges() && empty($this->instanceof); $definition = new Definition(); - $definition->setPublic($defaults->isPublic()); + if (!$defaults->isPublic() || !$defaults->isPrivate()) { + $definition->setPublic($defaults->isPublic() && !$defaults->isPrivate()); + } $definition->setAutowired($defaults->isAutowired()); $definition->setAutoconfigured($defaults->isAutoconfigured()); - $definition->setBindings($defaults->getBindings()); + // deep clone, to avoid multiple process of the same instance in the passes + $definition->setBindings(unserialize(serialize($defaults->getBindings()))); $definition->setChanges([]); $configurator = new ServiceConfigurator($this->container, $this->instanceof, $allowParent, $this, $definition, $id, $defaults->getTags()); @@ -101,7 +104,10 @@ final public function set($id, $class = null) final public function alias($id, $referencedId) { $ref = static::processValue($referencedId, true); - $alias = new Alias((string) $ref, $this->defaults->isPublic()); + $alias = new Alias((string) $ref); + if (!$this->defaults->isPublic() || !$this->defaults->isPrivate()) { + $alias->setPublic($this->defaults->isPublic()); + } $this->container->setAlias($id, $alias); return new AliasConfigurator($this, $alias); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/basic.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/basic.expected.yml index 1137961ade139..39a3b631b97eb 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/basic.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/basic.expected.yml @@ -6,5 +6,4 @@ services: synthetic: true App\BarService: class: App\BarService - public: true arguments: [!service { class: FooClass }] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.expected.yml index aaab7131c4697..f60d6bb5b72e2 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.expected.yml @@ -6,10 +6,7 @@ services: synthetic: true foo: class: Class2 - public: true file: file.php lazy: true arguments: [!service { class: Class1, public: false }] - bar: - alias: foo - public: true + bar: '@foo' diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/defaults.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/defaults.expected.yml index a534f7267a078..3f01b1099f73a 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/defaults.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/defaults.expected.yml @@ -6,7 +6,6 @@ services: synthetic: true App\BarService: class: App\BarService - public: true arguments: [!service { class: FooClass }] Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo: class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/instanceof.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/instanceof.expected.yml index b12a304221dd8..1238a7bda4fbf 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/instanceof.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/instanceof.expected.yml @@ -6,7 +6,6 @@ services: synthetic: true Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo: class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo - public: true tags: - { name: tag, k: v } lazy: true @@ -18,4 +17,3 @@ services: configurator: c foo: class: App\FooService - public: true diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/php7.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/php7.expected.yml index 7c5b714ffbd7e..7cec320b2eec7 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/php7.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/php7.expected.yml @@ -13,7 +13,6 @@ services: arguments: ['@bar'] bar: class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo - public: true calls: - [setFoo, { }] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype.expected.yml index ebfe087d779cf..24a79401531c9 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype.expected.yml @@ -6,7 +6,6 @@ services: synthetic: true Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo: class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo - public: true tags: - { name: foo } - { name: baz } @@ -15,7 +14,6 @@ services: factory: f Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Sub\Bar: class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Sub\Bar - public: true tags: - { name: foo } - { name: baz } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/services9.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/services9.php index d9373a2a6f9e6..ef390937687b1 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/services9.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/services9.php @@ -14,7 +14,7 @@ $p->set('foo_class', FooClass::class) ->set('foo', 'bar'); - $s = $c->services(); + $s = $c->services()->defaults()->public(); $s->set('foo') ->args(['foo', ref('foo.baz'), ['%foo%' => 'foo is %foo%', 'foobar' => '%foo%'], true, ref('service_container')]) ->class(FooClass::class) @@ -120,7 +120,6 @@ ->tag('foo'); $s->set('tagged_iterator', 'Bar') - ->public() ->args([tagged('foo')]); $s->alias('alias_for_foo', 'foo')->private()->public(); 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