Skip to content

Commit ce5ce3d

Browse files
committed
Don't inject promoted properties
1 parent 3366ab6 commit ce5ce3d

File tree

3 files changed

+32
-7
lines changed

3 files changed

+32
-7
lines changed

src/Definition/Source/AttributeBasedAutowiring.php

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,13 @@ public function getDefinitions() : array
7777
private function readProperties(ReflectionClass $class, ObjectDefinition $definition) : void
7878
{
7979
foreach ($class->getProperties() as $property) {
80-
if ($property->isStatic()) {
81-
continue;
82-
}
8380
$this->readProperty($property, $definition);
8481
}
8582

8683
// Read also the *private* properties of the parent classes
8784
/** @noinspection PhpAssignmentInConditionInspection */
8885
while ($class = $class->getParentClass()) {
8986
foreach ($class->getProperties(ReflectionProperty::IS_PRIVATE) as $property) {
90-
if ($property->isStatic()) {
91-
continue;
92-
}
9387
$this->readProperty($property, $definition, $class->getName());
9488
}
9589
}
@@ -100,6 +94,10 @@ private function readProperties(ReflectionClass $class, ObjectDefinition $defini
10094
*/
10195
private function readProperty(ReflectionProperty $property, ObjectDefinition $definition, string $classname = null) : void
10296
{
97+
if ($property->isStatic() || $property->isPromoted()) {
98+
return;
99+
}
100+
103101
// Look for #[Inject] attribute
104102
try {
105103
$attribute = $property->getAttributes(Inject::class)[0] ?? null;

tests/UnitTest/Definition/Source/AttributeBasedAutowiringTest.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use DI\Test\UnitTest\Definition\Source\Fixtures\AnnotationFixtureTypedProperties;
2121
use DI\Test\UnitTest\Definition\Source\Fixtures\AnnotationInjectableFixture;
2222
use DI\Test\UnitTest\Definition\Source\Fixtures\AttributeFixture;
23+
use DI\Test\UnitTest\Definition\Source\Fixtures\AttributeFixturePromotedProperty;
2324
use PHPUnit\Framework\TestCase;
2425

2526
/**
@@ -242,6 +243,19 @@ public function testReadParentPrivateProperties()
242243
$this->assertHasPropertyInjection($definition, 'propertyParentPrivate');
243244
}
244245

246+
public function testPromotedProperties(): void
247+
{
248+
$definition = (new AttributeBasedAutowiring)->autowire(AttributeFixturePromotedProperty::class);
249+
$this->assertNotHasPropertyInjection($definition, 'promotedProperty');
250+
251+
$constructorInjection = $definition->getConstructorInjection();
252+
$this->assertInstanceOf(MethodInjection::class, $constructorInjection);
253+
254+
$parameters = $constructorInjection->getParameters();
255+
$this->assertCount(1, $parameters);
256+
$this->assertEquals(new Reference('foo'), $parameters[0]);
257+
}
258+
245259
private function getMethodInjection(ObjectDefinition $definition, $name) : ?MethodInjection
246260
{
247261
$methodInjections = $definition->getMethodInjections();
@@ -279,7 +293,7 @@ private function assertNotHasPropertyInjection(ObjectDefinition $definition, $pr
279293
$propertyInjections = $definition->getPropertyInjections();
280294
foreach ($propertyInjections as $propertyInjection) {
281295
if ($propertyInjection->getPropertyName() === $propertyName) {
282-
$this->fail('No property injection found for ' . $propertyName);
296+
$this->fail('Unexpected property injection found for ' . $propertyName);
283297
}
284298
}
285299
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DI\Test\UnitTest\Definition\Source\Fixtures;
6+
7+
use DI\Attribute\Inject;
8+
9+
class AttributeFixturePromotedProperty
10+
{
11+
public function __construct(#[Inject("foo")] public $promotedProperty) {
12+
}
13+
}

0 commit comments

Comments
 (0)