diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82975-DeprecateUsageOfInjectWithNonPublicProperties.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82975-DeprecateUsageOfInjectWithNonPublicProperties.rst new file mode 100644 index 0000000000000000000000000000000000000000..cd0bd3d3e1253ffd0c46e4d74a20226890be18b1 --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82975-DeprecateUsageOfInjectWithNonPublicProperties.rst @@ -0,0 +1,58 @@ +.. include:: ../../Includes.txt + +=========================================================================== +Deprecation: #82975 - Deprecate usage of @inject with non-public properties +=========================================================================== + +See :issue:`82975` + +Description +=========== + +When using private or protected properties for Dependency Injection via :php:`@inject`, Extbase needs to +use the object reflection API to make these properties settable from the outside, +which is quite slow and cannot be cached in any way. Therefore property injection should +only work for public properties. + + +Impact +====== + +Using :php:`@inject` with a non-public property will trigger a deprecation warning and will +not work any longer in TYPO3 version 10. + + +Affected Installations +====================== + +All installations, that use property injection via :php:`@inject` with non-public properties + + +Migration +========= + +You have the following options to migrate: + + - Introduce an explicit :php:`inject*()` method (e.g. :php:`injectMyProperty()`) + - Use constructor injection + - Make the property public (think about whether this is desired in terms of software design) + + +An inject method would look like this: + +.. code-block:: php + + /** + * @var MyFancyProperty $myFancyProperty + */ + private $myFancyProperty; + + /** + * @param MyFancyProperty $myFancyProperty + */ + public function injectMyFancyProperty(MyFancyProperty $myFancyProperty): void + { + $this->myFancyProperty = $myFancyProperty; + } + +.. index:: PHP-API, ext:extbase, NotScanned diff --git a/typo3/sysext/extbase/Classes/Reflection/ClassSchema.php b/typo3/sysext/extbase/Classes/Reflection/ClassSchema.php index 580638693b9aae33f4aee410e00887aa232c2c30..fc36ebdf9154c6636dceee7399d8ee739af37085 100644 --- a/typo3/sysext/extbase/Classes/Reflection/ClassSchema.php +++ b/typo3/sysext/extbase/Classes/Reflection/ClassSchema.php @@ -194,6 +194,13 @@ class ClassSchema $this->properties[$propertyName]['annotations']['type'] = ltrim($varValues[0], '\\'); $this->properties[$propertyName]['annotations']['dependency'] = ltrim($varValues[0], '\\'); + if (!$reflectionProperty->isPublic()) { + trigger_error( + 'Using @inject with non-public properties is deprecated since TYPO3 v9.0 and will stop working in TYPO3 v10.0.', + E_USER_DEPRECATED + ); + } + $this->injectProperties[] = $propertyName; } catch (\Exception $e) { }