8000 Merge branch '5.0' · symfony/symfony@e94506b · GitHub
[go: up one dir, main page]

Skip to content

Commit e94506b

Browse files
Merge branch '5.0'
* 5.0: [DI] fix loading defaults when using the PHP-DSL RepeatedType should always have inner types mapped
2 parents 600280e + 8647ad3 commit e94506b

File tree

21 files changed

+100
-28
lines changed

21 files changed

+100
-28
lines changed

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ protected function describeContainerDeprecations(ContainerBuilder $builder, arra
386386

387387
protected function describeContainerAlias(Alias $alias, array $options = [], ContainerBuilder $builder = null)
388388
{
389-
if ($alias->isPublic()) {
389+
if ($alias->isPublic() && !$alias->isPrivate()) {
390390
$options['output']->comment(sprintf('This service is a <info>public</info> alias for the service <info>%s</info>', (string) $alias));
391391
} else {
392392
$options['output']->comment(sprintf('This service is a <comment>private</comment> alias for the service <info>%s</info>', (string) $alias));

src/Symfony/Component/Cache/DependencyInjection/CacheCollectorPass.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ public function process(ContainerBuilder $container)
5555

5656
$recorder = new Definition(is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class);
5757
$recorder->setTags($definition->getTags());
58-
$recorder->setPublic($definition->isPublic());
58+
if (!$definition->isPublic() || !$definition->isPrivate()) {
59+
$recorder->setPublic($definition->isPublic());
60+
}
5961
$recorder->setArguments([new Reference($innerId = $id.$this->cachePoolRecorderInnerSuffix)]);
6062

6163
$definition->setTags([]);

src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractServiceConfigurator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public function __destruct()
4242
/**
4343
* Registers a service.
4444
*/
45-
final public function set(string $id, string $class = null): ServiceConfigurator
45+
final public function set(?string $id, string $class = null): ServiceConfigurator
4646
{
4747
$this->__destruct();
4848

src/Symfony/Component/DependencyInjection/Loader/Configurator/PrototypeConfigurator.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,13 @@ class PrototypeConfigurator extends AbstractServiceConfigurator
4545
public function __construct(ServicesConfigurator $parent, PhpFileLoader $loader, Definition $defaults, string $namespace, string $resource, bool $allowParent)
4646
{
4747
$definition = new Definition();
48-
$definition->setPublic($defaults->isPublic());
48+
if (!$defaults->isPublic() || !$defaults->isPrivate()) {
49+
$definition->setPublic($defaults->isPublic());
50+
}
4951
$definition->setAutowired($defaults->isAutowired());
5052
$definition->setAutoconfigured($defaults->isAutoconfigured());
51-
$definition->setBindings($defaults->getBindings());
53+
// deep clone, to avoid multiple process of the same instance in the passes
54+
$definition->setBindings(unserialize(serialize($defaults->getBindings())));
5255
$definition->setChanges([]);
5356

5457
$this->loader = $loader;

src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,14 @@ final public function set(?string $id, string $class = null): ServiceConfigurato
8181

8282
$id = sprintf('.%d_%s', ++$this->anonymousCount, preg_replace('/^.*\\\\/', '', $class).'~'.$this->anonymousHash);
8383
$definition->setPublic(false);
84-
} else {
85-
$definition->setPublic($defaults->isPublic());
84+
} elseif (!$defaults->isPublic() || !$defaults->isPrivate()) {
85+
$definition->setPublic($defaults->isPublic() && !$defaults->isPrivate());
8686
}
8787

8888
$definition->setAutowired($defaults->isAutowired());
8989
$definition->setAutoconfigured($defaults->isAutoconfigured());
90-
$definition->setBindings($defaults->getBindings());
90+
// deep clone, to avoid multiple process of the same instance in the passes
91+
$definition->setBindings(unserialize(serialize($defaults->getBindings())));
9192
$definition->setChanges([]);
9293

9394
$configurator = new ServiceConfigurator($this->container, $this->instanceof, true, $this, $definition, $id, $defaults->getTags(), $this->path);
@@ -101,7 +102,10 @@ final public function set(?string $id, string $class = null): ServiceConfigurato
101102
final public function alias(string $id, string $referencedId): AliasConfigurator
102103
{
103104
$ref = static::processValue($referencedId, true);
104-
$alias = new Alias((string) $ref, $this->defaults->isPublic());
105+
$alias = new Alias((string) $ref);
106+
if (!$this->defaults->isPublic() || !$this->defaults->isPrivate()) {
107+
$alias->setPublic($this->defaults->isPublic());
108+
}
105109
$this->container->setAlias($id, $alias);
106110

107111
return new AliasConfigurator($this, $alias);

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use Symfony\Component\DependencyInjection\Tests\Fixtures\StdClassDecorator;
88

99
return function (ContainerConfigurator $c) {
10-
$s = $c->services();
10+
$s = $c->services()->defaults()->public();
1111

1212
$s->set('decorated', stdClass::class);
1313

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/basic.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use App\BarService;
66

77
return function (ContainerConfigurator $c) {
8-
$s = $c->services();
8+
$s = $c->services()->defaults()->public();
99
$s->set(BarService::class)
1010
->args([service('FooClass')]);
1111
};

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66

77
return function (ContainerConfigurator $c) {
88
$c->services()
9-
->set('bar', 'Class1')
9+
->set('bar', 'Class1')->public()
1010
->set(BarService::class)
11+
->public()
1112
->abstract(true)
1213
->lazy()
1314
->set('foo')
1415
->parent(BarService::class)
16+
->public()
1517
->decorate('bar', 'b', 1)
1618
->args([ref('b')])
1719
->class('Class2')

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/defaults.expected.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ services:
1818
arguments: ['@bar']
1919
bar:
2020
class: Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Foo
21-
public: false
21+
public: true
2222
tags:
2323
- { name: t, a: b }
2424
autowire: true

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/defaults.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
->autowire()
1515
->tag('t', ['a' => 'b'])
1616
->bind(Foo::class, ref('bar'))
17-
->private();
17+
->public();
1818

1919
$s->set(Foo::class)->args([ref('bar')])->public();
2020
$s->set('bar', Foo::class)->call('setFoo')->autoconfigure(false);

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/instanceof.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype;
77

88
return function (ContainerConfigurator $c) {
9-
$s = $c->services();
9+
$s = $c->services()->defaults()->public();
1010
$s->instanceof(Prototype\Foo::class)
1111
->property('p', 0)
1212
->call('setFoo', [ref('foo')])

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/lazy_fqcn.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
44

55
return function (ContainerConfigurator $c) {
6-
$di = $c->services();
6+
$di = $c->services()->defaults()->public();
77
$di->set('foo', 'stdClass')->lazy('SomeInterface');
88
};

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/object.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
return new class() {
88
public function __invoke(ContainerConfigurator $c)
99
{
10-
$s = $c->services();
10+
$s = $c->services()->defaults()->public();
1111
$s->set(BarService::class)
1212
->args([service('FooClass')]);
1313
}

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/php7.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
('foo', 'Foo')
1010
('bar', 'Bar')
1111
;
12-
$c->services()
12+
$c->services()->defaults()->public()
1313
(Foo::class)
1414
->arg('$bar', ref('bar'))
1515
->public()

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
$di = $c->services()->defaults()
99
->tag('baz');
1010
$di->load(Prototype::class.'\\', '../Prototype')
11+
->public()
1112
->autoconfigure()
1213
->exclude('../Prototype/{OtherDir,BadClasses,SinglyImplementedInterface}')
1314
->factory('f')
@@ -17,6 +18,6 @@
1718
->autoconfigure(false)
1819
->tag('foo')
1920
->parent('foo');
20-
$di->set('foo')->lazy()->abstract();
21+
$di->set('foo')->lazy()->abstract()->public();
2122
$di->get(Prototype\Foo::class)->lazy(false);
2223
};

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/prototype_array.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
$di = $c->services()->defaults()
99
->tag('baz');
1010
$di->load(Prototype::class.'\\', '../Prototype')
11+
->public()
1112
->autoconfigure()
1213
->exclude(['../Prototype/OtherDir', '../Prototype/BadClasses', '../Prototype/SinglyImplementedInterface'])
1314
->factory('f')
@@ -17,6 +18,6 @@
1718
->autoconfigure(false)
1819
->tag('foo')
1920
->parent('foo');
20-
$di->set('foo')->lazy()->abstract();
21+
$di->set('foo')->lazy()->abstract()->public();
2122
$di->get(Prototype\Foo::class)->lazy(false);
2223
};

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/services9.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
$p->set('foo_class', FooClass::class)
1717
->set('foo', 'bar');
1818

19-
$s = $c->services()->defaults()
20-
->public();
19+
$s = $c->services()->defaults()->public();
2120
$s->set('foo')
2221
->args(['foo', ref('foo.baz'), ['%foo%' => 'foo is %foo%', 'foobar' => '%foo%'], true, ref('service_container')])
2322
->class(FooClass::class)
@@ -127,12 +126,10 @@
127126
->tag('foo');
128127

129128
$s->set('tagged_iterator', 'Bar')
130-
->public()
131129
->args([tagged_iterator('foo')]);
132130

133131
$s->set('runtime_error', 'stdClass')
134-
->args([new Reference('errored_definition', ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE)])
135-
->public();
132+
->args([new Reference('errored_definition', ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE)]);
136133
$s->set('errored_definition', 'stdClass')->private();
137134
$s->set('preload_sidekick', 'stdClass')
138135
->tag('container.preload', ['class' => 'Some\Sidekick1'])

src/Symfony/Component/Form/Extension/Core/Type/RepeatedType.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,16 @@ public function buildForm(FormBuilderInterface $builder, array $options)
3131
$options['options']['error_bubbling'] = $options['error_bubbling'];
3232
}
3333

34+
// children fields must always be mapped
35+
$defaultOptions = ['mapped' => true];
36+
3437
$builder
3538
->addViewTransformer(new ValueToDuplicatesTransformer([
3639
$options['first_name'],
3740
$options['second_name'],
3841
]))
39-
->add($options['first_name'], $options['type'], array_merge($options['options'], $options['first_options']))
40-
->add($options['second_name'], $options['type'], array_merge($options['options'], $options['second_options']))
42+
->add($options['first_name'], $options['type'], array_merge($options['options'], $options['first_options'], $defaultOptions))
43+
->add($options['second_name'], $options['type'], array_merge($options['options'], $options['second_options'], $defaultOptions))
4144
;
4245
}
4346

src/Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Form\Tests\Extension\Core\Type;
1313

1414
use Symfony\Component\Form\Form;
15+
use Symfony\Component\Form\Tests\Fixtures\NotMappedType;
1516

1617
class RepeatedTypeTest extends BaseTypeTest
1718
{
@@ -78,6 +79,41 @@ public function testSetRequired()
7879
$this->assertFalse($form['second']->isRequired());
7980
}
8081

82+
public function testMappedOverridesDefault()
83+
{
84+
$form = $this->factory->create(NotMappedType::class);
85+
$this->assertFalse($form->getConfig()->getMapped());
86+
87+
$form = $this->factory->create(static::TESTED_TYPE, null, [
88+
'type' => NotMappedType::class,
89+
]);
90+
91+
$this->assertTrue($form['first']->getConfig()->getMapped());
92+
$this->assertTrue($form['second']->getConfig()->getMapped());
93+
}
94+
95+
/**
96+
* @dataProvider notMappedConfigurationKeys
10000 97+
*/
98+
public function testNotMappedInnerIsOverridden($configurationKey)
99+
{
100+
$form = $this->factory->create(static::TESTED_TYPE, null, [
101+
'type' => TextTypeTest::TESTED_TYPE,
102+
$configurationKey => ['mapped' => false],
103+
]);
104+
105+
$this->assertTrue($form['first']->getConfig()->getMapped());
106+
$this->assertTrue($form['second']->getConfig()->getMapped());
107+
}
108+
109+
public function notMappedConfigurationKeys()
110+
{
111+
return [
112+
['first_options'],
113+
['second_options'],
114+
];
115+
}
116+
81117
public function testSetInvalidOptions()
82118
{
83119
$this->expectException('Symfony\Component\OptionsResolver\Exception\InvalidOptionsException');
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Form\Tests\Fixtures;
13+
14+
use Symfony\Component\Form\AbstractType;
15+
use Symfony\Component\OptionsResolver\OptionsResolver;
16+
17+
class NotMappedType extends AbstractType
18+
{
19+
public function configureOptions(OptionsResolver $resolver)
20+
{
21+
$resolver->setDefault('mapped', false);
22+
}
23+
}

src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public function process(ContainerBuilder $container)
5555

5656
$publicAliases = [];
5757
foreach ($container->getAliases() as $id => $alias) {
58-
if ($alias->isPublic()) {
58+
if ($alias->isPublic() && !$alias->isPrivate()) {
5959
$publicAliases[(string) $alias][] = $id;
6060
}
6161
}

0 commit comments

Comments
 (0)
0