Skip to content

Commit 9426384

Browse files
Merge branch '4.2'
* 4.2: [FrameworkBundle] decouple debug:autowiring from phpdocumentor/reflection-docblock Fix env fallback to an unresolved variable [DI] map snake-case ids of service subscribers to camel-case autowiring aliases
2 parents 23084c2 + 50bf074 commit 9426384

File tree

4 files changed

+38
-5
lines changed

4 files changed

+38
-5
lines changed

Compiler/RegisterServiceSubscribersPass.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ protected function processValue($value, $isRoot = false)
9191
$name = null;
9292
}
9393

94+
if (null !== $name && !$this->container->has($name) && !$this->container->has($type.' $'.$name)) {
95+
$camelCaseName = lcfirst(str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $name))));
96+
$name = $this->container->has($type.' $'.$camelCaseName) ? $camelCaseName : $name;
97+
}
98+
9499
$subscriberMap[$key] = new TypedReference((string) $serviceMap[$key], $type, $optionalBehavior ?: ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $name);
95100
unset($serviceMap[$key]);
96101
}

ContainerBuilder.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,11 +1534,15 @@ protected function getEnv($name)
15341534
return $value;
15351535
}
15361536

1537-
foreach ($bag->getEnvPlaceholders() as $env => $placeholders) {
1538-
if (isset($placeholders[$value])) {
1539-
$bag = new ParameterBag($bag->all());
1537+
$envPlaceholders = $bag->getEnvPlaceholders();
1538+
if (isset($envPlaceholders[$name][$value])) {
1539+
$bag = new ParameterBag($bag->all());
15401540

1541-
return $bag->unescapeValue($bag->get("env($name)"));
1541+
return $bag->unescapeValue($bag->get("env($name)"));
1542+
}
1543+
foreach ($envPlaceholders as $env => $placeholders) {
1544+
if (isset($placeholders[$value])) {
1545+
return $this->getEnv($env);
15421546
}
15431547
}
15441548

Tests/Compiler/RegisterServiceSubscribersPassTest.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,17 @@ public function testServiceSubscriberWithSemanticId()
204204
$subscriber = new class() implements ServiceSubscriberInterface {
205205
public static function getSubscribedServices()
206206
{
207-
return array('some.service' => 'stdClass');
207+
return array(
208+
'some.service' => 'stdClass',
209+
'some_service' => 'stdClass',
210+
'another_service' => 'stdClass',
211+
);
208212
}
209213
};
210214
$container->register('some.service', 'stdClass');
211215
$container->setAlias('stdClass $someService', 'some.service');
216+
$container->setAlias('stdClass $some_service', 'some.service');
217+
$container->setAlias('stdClass $anotherService', 'some.service');
212218
$container->register('foo', \get_class($subscriber))
213219
->addMethodCall('setContainer', array(new Reference(PsrContainerInterface::class)))
214220
->addTag('container.service_subscriber');
@@ -221,13 +227,17 @@ public static function getSubscribedServices()
221227

222228
$expected = array(
223229
'some.service' => new ServiceClosureArgument(new TypedReference('stdClass', 'stdClass', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'some.service')),
230+
'some_service' => new ServiceClosureArgument(new TypedReference('stdClass', 'stdClass', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'some_service')),
231+
'another_service' => new ServiceClosureArgument(new TypedReference('stdClass', 'stdClass', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'anotherService')),
224232
);
225233
$this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0));
226234

227235
(new AutowirePass())->process($container);
228236

229237
$expected = array(
230238
'some.service' => new ServiceClosureArgument(new TypedReference('some.service', 'stdClass')),
239+
'some_service' => new ServiceClosureArgument(new TypedReference('stdClass $some_service', 'stdClass')),
240+
'another_service' => new ServiceClosureArgument(new TypedReference('stdClass $anotherService', 'stdClass')),
231241
);
232242
$this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0));
233243
}

Tests/ContainerBuilderTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,20 @@ public function testDynamicEnv()
738738
$this->assertSame('someFooBar', $container->getParameter('baz'));
739739
}
740740

741+
public function testFallbackEnv()
742+
{
743+
putenv('DUMMY_FOO=foo');
744+
745+
$container = new ContainerBuilder();
746+
$container->setParameter('foo', '%env(DUMMY_FOO)%');
747+
$container->setParameter('bar', 'bar%env(default:foo:DUMMY_BAR)%');
748+
749+
$container->compile(true);
750+
putenv('DUMMY_FOO');
751+
752+
$this->assertSame('barfoo', $container->getParameter('bar'));
753+
}
754+
741755
public function testCastEnv()
742756
{
743757
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)