diff --git a/typo3/sysext/extbase/Classes/Object/Container/Container.php b/typo3/sysext/extbase/Classes/Object/Container/Container.php index 4d7682525385b70041f80cee88e964b739df42f8..24a86b2bae6fff082e6a6854d94711a401c47a9f 100644 --- a/typo3/sysext/extbase/Classes/Object/Container/Container.php +++ b/typo3/sysext/extbase/Classes/Object/Container/Container.php @@ -212,10 +212,14 @@ class Container implements \TYPO3\CMS\Core\SingletonInterface if ($classSchema->isSingleton() && !$instanceToInject instanceof \TYPO3\CMS\Core\SingletonInterface) { $this->getLogger()->notice('The singleton "' . $classSchema->getClassName() . '" needs a prototype in "' . $injectPropertyName . '". This is often a bad code smell; often you rather want to inject a singleton.'); } - $propertyReflection = new \ReflectionProperty($instance, $injectPropertyName); - $propertyReflection->setAccessible(true); - $propertyReflection->setValue($instance, $instanceToInject); + if ($classSchema->getProperty($injectPropertyName)['public']) { + $instance->{$injectPropertyName} = $instanceToInject; + } else { + $propertyReflection = new \ReflectionProperty($instance, $injectPropertyName); + $propertyReflection->setAccessible(true); + $propertyReflection->setValue($instance, $instanceToInject); + } } } diff --git a/typo3/sysext/extbase/Tests/Unit/Object/Container/ContainerTest.php b/typo3/sysext/extbase/Tests/Unit/Object/Container/ContainerTest.php index 91ef94bb8a036be69509d5758b688c091783b9e9..735093f4841de66efd2cfe4aa1619451b9b48932 100644 --- a/typo3/sysext/extbase/Tests/Unit/Object/Container/ContainerTest.php +++ b/typo3/sysext/extbase/Tests/Unit/Object/Container/ContainerTest.php @@ -15,9 +15,13 @@ namespace TYPO3\CMS\Extbase\Tests\Unit\Object\Container; */ use Psr\Log\LoggerInterface; use TYPO3\CMS\Core\Log\Logger; +use TYPO3\CMS\Extbase\Object\Container\Container; use TYPO3\CMS\Extbase\Object\Exception; use TYPO3\CMS\Extbase\Object\Exception\CannotBuildObjectException; use TYPO3\CMS\Extbase\Reflection\Exception\UnknownClassException; +use TYPO3\CMS\Extbase\Tests\Unit\Object\Container\Fixtures\ArgumentTestClassForPublicPropertyInjection; +use TYPO3\CMS\Extbase\Tests\Unit\Object\Container\Fixtures\ProtectedPropertyInjectClass; +use TYPO3\CMS\Extbase\Tests\Unit\Object\Container\Fixtures\PublicPropertyInjectClass; /** * Test case @@ -953,4 +957,24 @@ class ContainerTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase $object->argumentTestClassTwo ); } + + /** + * @test + */ + public function getInstanceInjectsPublicProperties() + { + $container = new Container(); + $object = $container->getInstance(PublicPropertyInjectClass::class); + self::assertInstanceOf(ArgumentTestClassForPublicPropertyInjection::class, $object->foo); + } + + /** + * @test + */ + public function getInstanceInjectsProtectedProperties() + { + $container = new Container(); + $object = $container->getInstance(ProtectedPropertyInjectClass::class); + self::assertInstanceOf(ArgumentTestClassForPublicPropertyInjection::class, $object->getFoo()); + } } diff --git a/typo3/sysext/extbase/Tests/Unit/Object/Container/Fixtures/ContainerPropertyInjectionTestClasses.php b/typo3/sysext/extbase/Tests/Unit/Object/Container/Fixtures/ContainerPropertyInjectionTestClasses.php new file mode 100644 index 0000000000000000000000000000000000000000..f81af86fc2f18bf84360cf79714fa198e01023c3 --- /dev/null +++ b/typo3/sysext/extbase/Tests/Unit/Object/Container/Fixtures/ContainerPropertyInjectionTestClasses.php @@ -0,0 +1,34 @@ +<?php +declare(strict_types=1); + +namespace TYPO3\CMS\Extbase\Tests\Unit\Object\Container\Fixtures; + +use TYPO3\CMS\Extbase\Annotation\Inject; + +class PublicPropertyInjectClass +{ + /** + * @Inject + * @var \TYPO3\CMS\Extbase\Tests\Unit\Object\Container\Fixtures\ArgumentTestClassForPublicPropertyInjection + */ + public $foo; +} + +class ArgumentTestClassForPublicPropertyInjection +{ +} + +class ProtectedPropertyInjectClass +{ + + /** + * @Inject + * @var \TYPO3\CMS\Extbase\Tests\Unit\Object\Container\Fixtures\ArgumentTestClassForPublicPropertyInjection + */ + protected $foo; + + public function getFoo() + { + return $this->foo; + } +}