Breaking: #92238 - Service injection in Extbase validators
See forge#92238
Description
With the deprecation and removal of objectManager usage in TYPO3, Extbase does not use the objectManager to create validator instances any more.
Note
This has been mitigated with recent TYPO3 v11 core releases: Extbase validators
can use dependency injection again. See this changelog
for details.
Additionally, all validators delivered by EXT:extbase and EXT:form will be marked
final
in v12. Extensions can no longer extend validators but must extend abstract
classes or implement the interfaces directly.
Impact
Validators that use dependency injection will experience non injected services for affected properties.
Affected Installations
All installations that use dependency injection in Extbase validators.
Migration
Instead of injecting services to the validator, use
General
to create an instance of required services.
Given the following example for a service injection in a validator:
/**
* @var ConfigurationManagerInterface
*/
protected $configurationManager;
/**
* @param ConfigurationManagerInterface $configurationManager
*/
public function injectConfigurationManager(ConfigurationManagerInterface $configurationManager)
{
$this->configurationManager = $configurationManager;
}
Since the configurationManager is required globally in the class,
General
is used in the constructor of the validator to create an instance of the service.
/**
* @var ConfigurationManagerInterface
*/
protected $configurationManager;
public function __construct(array $options = [])
{
$this->configurationManager = GeneralUtility::makeInstance(ConfigurationManagerInterface::class);
parent::__construct($options);
}
In order to create instances of services that require dependency injection and which
are not already instantiated in the service container, it is required to declare those
services as
public: true
in the
Configuration/
of the given extension.
Vendor\MyExtension\Services\MyService:
public: true