Skip to content

Commit e915c66

Browse files
Merge branch '6.4' into 7.0
* 6.4: Fix RequestPayloadValueResolver handling error with no ExpectedTypes [Mime] Fix serializing uninitialized RawMessage::$message to null [Notifer][Smsapi] Set messageId of SentMessage [DX] Use Symfony "dark-mode"-responsive logo in README support lazy evaluated exception messages with Xdebug 3 Provide more precise phpdoc for FileLocatorInterface::locate [DependencyInjection] #[Autowire] attribute should have precedence over bindings
2 parents 9f203a7 + 6871811 commit e915c66

File tree

4 files changed

+122
-3
lines changed

4 files changed

+122
-3
lines changed

Compiler/ResolveBindingsPass.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\DependencyInjection\Argument\BoundArgument;
1515
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1616
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
17+
use Symfony\Component\DependencyInjection\Attribute\Autowire;
1718
use Symfony\Component\DependencyInjection\Attribute\Target;
1819
use Symfony\Component\DependencyInjection\ContainerBuilder;
1920
use Symfony\Component\DependencyInjection\Definition;
@@ -184,6 +185,13 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed
184185
if (\array_key_exists($parameter->name, $arguments) && '' !== $arguments[$parameter->name]) {
185186
continue;
186187
}
188+
if (
189+
$value->isAutowired()
190+
&& !$value->hasTag('container.ignore_attributes')
191+
&& $parameter->getAttributes(Autowire::class, \ReflectionAttribute::IS_INSTANCEOF)
192+
) {
193+
continue;
194+
}
187195

188196
$typeHint = ltrim(ProxyHelper::exportType($parameter) ?? '', '?');
189197

Exception/AutowiringFailedException.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ public function __construct(string $serviceId, string|\Closure $message = '', in
2323
{
2424
$this->serviceId = $serviceId;
2525

26-
if ($message instanceof \Closure
27-
&& (\function_exists('xdebug_is_enabled') ? xdebug_is_enabled() : \function_exists('xdebug_info'))
28-
) {
26+
if ($message instanceof \Closure && \function_exists('xdebug_is_enabled') && xdebug_is_enabled()) {
2927
$message = $message();
3028
}
3129

Tests/Compiler/IntegrationTest.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Psr\Container\ContainerInterface;
1616
use Symfony\Component\Config\FileLocator;
1717
use Symfony\Component\DependencyInjection\Alias;
18+
use Symfony\Component\DependencyInjection\Argument\BoundArgument;
1819
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1920
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
2021
use Symfony\Component\DependencyInjection\ChildDefinition;
@@ -50,6 +51,7 @@
5051
use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod;
5152
use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerWithDefaultPriorityMethod;
5253
use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerWithoutIndex;
54+
use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerWithServiceSubscriber;
5355
use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedService1;
5456
use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedService2;
5557
use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedService3;
@@ -1118,6 +1120,66 @@ public function testTaggedIteratorAndLocatorWithExclude()
11181120
$this->assertTrue($locator->has(AutoconfiguredService2::class));
11191121
$this->assertFalse($locator->has(TaggedConsumerWithExclude::class));
11201122
}
1123+
1124+
public function testAutowireAttributeHasPriorityOverBindings()
1125+
{
1126+
$container = new ContainerBuilder();
1127+
$container->register(FooTagClass::class)
1128+
->setPublic(true)
1129+
->addTag('foo_bar', ['key' => 'tagged_service'])
1130+
;
1131+
$container->register(TaggedLocatorConsumerWithServiceSubscriber::class)
1132+
->setBindings([
1133+
'$locator' => new BoundArgument(new Reference('service_container'), false),
1134+
])
1135+
->setPublic(true)
1136+
->setAutowired(true)
1137+
->addTag('container.service_subscriber')
1138+
;
1139+
$container->register('subscribed_service', \stdClass::class)
1140+
->setPublic(true)
1141+
;
1142+
1143+
$container->compile();
1144+
1145+
/** @var TaggedLocatorConsumerWithServiceSubscriber $s */
1146+
$s = $container->get(TaggedLocatorConsumerWithServiceSubscriber::class);
1147+
1148+
self::assertInstanceOf(ContainerInterface::class, $subscriberLocator = $s->getContainer());
1149+
self::assertTrue($subscriberLocator->has('subscribed_service'));
1150+
self::assertNotSame($subscriberLocator, $taggedLocator = $s->getLocator());
1151+
self::assertInstanceOf(ContainerInterface::class, $taggedLocator);
1152+
self::assertTrue($taggedLocator->has('tagged_service'));
1153+
}
1154+
1155+
public function testBindingsWithAutowireAttributeAndAutowireFalse()
1156+
{
1157+
$container = new ContainerBuilder();
1158+
$container->register(FooTagClass::class)
1159+
->setPublic(true)
1160+
->addTag('foo_bar', ['key' => 'tagged_service'])
1161+
;
1162+
$container->register(TaggedLocatorConsumerWithServiceSubscriber::class)
1163+
->setBindings([
1164+
'$locator' => new BoundArgument(new Reference('service_container'), false),
1165+
])
1166+
->setPublic(true)
1167+
->setAutowired(false)
1168+
->addTag('container.service_subscriber')
1169+
;
1170+
$container->register('subscribed_service', \stdClass::class)
1171+
->setPublic(true)
1172+
;
1173+
1174+
$container->compile();
1175+
1176+
/** @var TaggedLocatorConsumerWithServiceSubscriber $s */
1177+
$s = $container->get(TaggedLocatorConsumerWithServiceSubscriber::class);
1178+
1179+
self::assertNull($s->getContainer());
1180+
self::assertInstanceOf(ContainerInterface::class, $taggedLocator = $s->getLocator());
1181+
self::assertSame($container, $taggedLocator);
1182+
}
11211183
}
11221184

11231185
class ServiceSubscriberStub implements ServiceSubscriberInterface
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
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\DependencyInjection\Tests\Fixtures;
13+
14+
use Psr\Container\ContainerInterface;
15+
use Symfony\Component\DependencyInjection\Attribute\TaggedLocator;
16+
use Symfony\Contracts\Service\Attribute\Required;
17+
use Symfony\Contracts\Service\ServiceSubscriberInterface;
18+
19+
final class TaggedLocatorConsumerWithServiceSubscriber implements ServiceSubscriberInterface
20+
{
21+
private ?ContainerInterface $container = null;
22+
23+
public function __construct(
24+
#[TaggedLocator('foo_bar', indexAttribute: 'key')]
25+
private ContainerInterface $locator,
26+
) {
27+
}
28+
29+
public function getLocator(): ContainerInterface
30+
{
31+
return $this->locator;
32+
}
33+
34+
public function getContainer(): ?ContainerInterface
35+
{
36+
return $this->container;
37+
}
38+
39+
#[Required]
40+
public function setContainer(ContainerInterface $container): void
41+
{
42+
$this->container = $container;
43+
}
44+
45+
public static function getSubscribedServices(): array
46+
{
47+
return [
48+
'subscribed_service',
49+
];
50+
}
51+
}

0 commit comments

Comments
 (0)