Skip to content

Commit a1c8134

Browse files
Merge branch '6.4' into 7.0
* 6.4: [Serializer] Remove TranslatableNormalizer service when the Translator is disabled Fix support to denormalize plain object types [Routing] Restore aliases removal in RouteCollection::remove() [Workflow] Add `getEnabledTransition()` to TraceableWorkflow [DependencyInjection] Fix parsing named autowiring aliases that contain underscores [Console] Add Les-Tilleuls.coop as sponsor of version 6.4/7.0 remove duplicated service definition
2 parents 7a66efd + 270e648 commit a1c8134

File tree

21 files changed

+255
-29
lines changed

21 files changed

+255
-29
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1857,7 +1857,7 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
18571857
$container->removeDefinition('serializer.mapping.cache_class_metadata_factory');
18581858
}
18591859

1860-
if (!class_exists(Translator::class)) {
1860+
if (!$this->readConfigEnabled('translator', $container, $config)) {
18611861
$container->removeDefinition('serializer.normalizer.translatable');
18621862
}
18631863

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'annotations' => false,
5+
'http_method_override' => false,
6+
'handle_all_throwables' => true,
7+
'php_errors' => ['log' => true],
8+
'serializer' => [
9+
'enabled' => true,
10+
],
11+
'translator' => [
12+
'enabled' => false,
13+
],
14+
]);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:framework="http://symfony.com/schema/dic/symfony"
6+
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
7+
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
8+
9+
<framework:config secret="s3cr3t" http-method-override="false" handle-all-throwables="true">
10+
<framework:annotations enabled="false" />
11+
<framework:php-errors log="true" />
12+
<framework:serializer enabled="true" />
13+
<framework:translator enabled="false" />
14+
</framework:config>
15+
</container>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
framework:
2+
annotations: false
3+
http_method_override: false
4+
handle_all_throwables: true
5+
php_errors:
6+
log: true
7+
serializer:
8+
enabled: true
9+
translator:
10+
enabled: false

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,6 +1434,12 @@ public function testSerializerEnabled()
14341434
$this->assertEquals($container->getDefinition('serializer.normalizer.object')->getArgument(6)['max_depth_handler'], new Reference('my.max.depth.handler'));
14351435
}
14361436

1437+
public function testSerializerWithoutTranslator()
1438+
{
1439+
$container = $this->createContainerFromFile('serializer_without_translator');
1440+
$this->assertFalse($container->hasDefinition('serializer.normalizer.translatable'));
1441+
}
1442+
14371443
public function testRegisterSerializerExtractor()
14381444
{
14391445
$container = $this->createContainerFromFile('full');

src/Symfony/Component/Console/README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,14 @@ interfaces.
77
Sponsor
88
-------
99

10-
Help Symfony by [sponsoring][1] its development!
10+
The Console component for Symfony 7.0 is [backed][1] by [Les-Tilleuls.coop][2].
11+
12+
Les-Tilleuls.coop is a team of 70+ Symfony experts who can help you design, develop and
13+
fix your projects. They provide a wide range of professional services including development,
14+
consulting, coaching, training and audits. They also are highly skilled in JS, Go and DevOps.
15+
They are a worker cooperative!
16+
17+
Help Symfony by [sponsoring][3] its development!
1118

1219
Resources
1320
---------
@@ -24,4 +31,6 @@ Credits
2431
`Resources/bin/hiddeninput.exe` is a third party binary provided within this
2532
component. Find sources and license at https://github.com/Seldaek/hidden-input.
2633

27-
[1]: https://symfony.com/sponsor
34+
[1]: https://symfony.com/backers
35+
[2]: https://les-tilleuls.coop
36+
[3]: https://symfony.com/sponsor

src/Symfony/Component/DependencyInjection/Attribute/Target.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ public function getParsedName(): string
3636
return lcfirst(str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $this->name))));
3737
}
3838

39-
public static function parseName(\ReflectionParameter $parameter, self &$attribute = null): string
39+
public static function parseName(\ReflectionParameter $parameter, self &$attribute = null, string &$parsedName = null): string
4040
{
4141
$attribute = null;
4242
if (!$target = $parameter->getAttributes(self::class)[0] ?? null) {
43+
$parsedName = (new self($parameter->name))->getParsedName();
44+
4345
return $parameter->name;
4446
}
4547

@@ -57,6 +59,6 @@ public static function parseName(\ReflectionParameter $parameter, self &$attribu
5759
throw new InvalidArgumentException(sprintf('Invalid #[Target] name "%s" on parameter "$%s" of "%s()": the first character must be a letter.', $name, $parameter->name, $function));
5860
}
5961

60-
return $parsedName;
62+
return preg_match('/^[a-zA-Z0-9_\x7f-\xff]++$/', $name) ? $name : $parsedName;
6163
}
6264
}

src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -444,20 +444,30 @@ private function getAutowiredReference(TypedReference $reference, bool $filterTy
444444
$name = $target = (array_filter($reference->getAttributes(), static fn ($a) => $a instanceof Target)[0] ?? null)?->name;
445445

446446
if (null !== $name ??= $reference->getName()) {
447+
if ($this->container->has($alias = $type.' $'.$name) && !$this->container->findDefinition($alias)->isAbstract()) {
448+
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
449+
}
450+
451+
if (null !== ($alias = $this->getCombinedAlias($type, $name)) && !$this->container->findDefinition($alias)->isAbstract()) {
452+
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
453+
}
454+
447455
$parsedName = (new Target($name))->getParsedName();
448456

449457
if ($this->container->has($alias = $type.' $'.$parsedName) && !$this->container->findDefinition($alias)->isAbstract()) {
450458
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
451459
}
452460

453-
if (null !== ($alias = $this->getCombinedAlias($type, $parsedName) ?? null) && !$this->container->findDefinition($alias)->isAbstract()) {
461+
if (null !== ($alias = $this->getCombinedAlias($type, $parsedName)) && !$this->container->findDefinition($alias)->isAbstract()) {
454462
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
455463
}
456464

457-
if ($this->container->has($name) && !$this->container->findDefinition($name)->isAbstract()) {
465+
if (($this->container->has($n = $name) && !$this->container->findDefinition($n)->isAbstract())
466+
|| ($this->container->has($n = $parsedName) && !$this->container->findDefinition($n)->isAbstract())
467+
) {
458468
foreach ($this->container->getAliases() as $id => $alias) {
459-
if ($name === (string) $alias && str_starts_with($id, $type.' $')) {
460-
return new TypedReference($name, $type, $reference->getInvalidBehavior());
469+
if ($n === (string) $alias && str_starts_with($id, $type.' $')) {
470+
return new TypedReference($n, $type, $reference->getInvalidBehavior());
461471
}
462472
}
463473
}
@@ -471,7 +481,7 @@ private function getAutowiredReference(TypedReference $reference, bool $filterTy
471481
return new TypedReference($type, $type, $reference->getInvalidBehavior());
472482
}
473483

474-
if (null !== ($alias = $this->getCombinedAlias($type) ?? null) && !$this->container->findDefinition($alias)->isAbstract()) {
484+
if (null !== ($alias = $this->getCombinedAlias($type)) && !$this->container->findDefinition($alias)->isAbstract()) {
475485
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
476486
}
477487

src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,16 +187,19 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed
187187

188188
$typeHint = ltrim(ProxyHelper::exportType($parameter) ?? '', '?');
189189

190-
$name = Target::parseName($parameter);
190+
$name = Target::parseName($parameter, parsedName: $parsedName);
191191

192-
if ($typeHint && \array_key_exists($k = preg_replace('/(^|[(|&])\\\\/', '\1', $typeHint).' $'.$name, $bindings)) {
192+
if ($typeHint && (
193+
\array_key_exists($k = preg_replace('/(^|[(|&])\\\\/', '\1', $typeHint).' $'.$name, $bindings)
194+
|| \array_key_exists($k = preg_replace('/(^|[(|&])\\\\/', '\1', $typeHint).' $'.$parsedName, $bindings)
195+
)) {
193196
$arguments[$key] = $this->getBindingValue($bindings[$k]);
194197

195198
continue;
196199
}
197200

198-
if (\array_key_exists('$'.$name, $bindings)) {
199-
$arguments[$key] = $this->getBindingValue($bindings['$'.$name]);
201+
if (\array_key_exists($k = '$'.$name, $bindings) || \array_key_exists($k = '$'.$parsedName, $bindings)) {
202+
$arguments[$key] = $this->getBindingValue($bindings[$k]);
200203

201204
continue;
202205
}
@@ -207,7 +210,7 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed
207210
continue;
208211
}
209212

210-
if (isset($bindingNames[$name]) || isset($bindingNames[$parameter->name])) {
213+
if (isset($bindingNames[$name]) || isset($bindingNames[$parsedName]) || isset($bindingNames[$parameter->name])) {
211214
$bindingKey = array_search($binding, $bindings, true);
212215
$argumentType = substr($bindingKey, 0, strpos($bindingKey, ' '));
213216
$this->errorMessages[] = sprintf('Did you forget to add the type "%s" to argument "$%s" of method "%s::%s()"?', $argumentType, $parameter->name, $reflectionMethod->class, $reflectionMethod->name);

src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1191,6 +1191,18 @@ public function testAutowireWithNamedArgs()
11911191
$this->assertEquals([new TypedReference(A::class, A::class), 'abc'], $container->getDefinition('foo')->getArguments());
11921192
}
11931193

1194+
public function testAutowireUnderscoreNamedArgument()
1195+
{
1196+
$container = new ContainerBuilder();
1197+
1198+
$container->autowire(\DateTimeImmutable::class.' $now_datetime', \DateTimeImmutable::class);
1199+
$container->autowire('foo', UnderscoreNamedArgument::class)->setPublic(true);
1200+
1201+
(new AutowirePass())->process($container);
1202+
1203+
$this->assertInstanceOf(\DateTimeImmutable::class, $container->get('foo')->now_datetime);
1204+
}
1205+
11941206
public function testAutowireDefaultValueParametersLike()
11951207
{
11961208
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)