Feature: #89054 - Provide core cache frontends via dependency injection
See forge#89054
Description
With TYPO3 v10.0 dependency injection has been introduced. To work with
the cache, currently only the \TYPO3\
is available as a service within
the dependency injection container. To foster the „Inversion of Control“ pattern,
the instances of \TYPO3\
should
be injected to the objects rather than using the \TYPO3\
.
Classes should be adapted to avoid \TYPO3\
whenever possible.
The TYPO3 core provides all core caches as dependency injection services.
The name of the service follows the scheme cache.
.
E.g. the core cache frontend will have the service id cache.
.
Third party extensions are encouraged to do the same and provide a cache.
service in Configuration/
for cache configuration they define
in ext_
.
Usage
Given a class needs the "my_cache" cache Frontend, then the code before TYPO3 v10.1 looked like the following example:
class MyClass
{
/**
* @var TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
*/
private $cache;
public function __construct()
{
$cacheManager = GeneralUtility::makeInstance(CacheManager::class);
$this->cache = $cacheManager->getCache('my_cache');
}
}
The instance of \TYPO3\
was retrieved by creating an instance
of \TYPO3\
and then by calling the get
method.
To inject the cache directly, the class needs to be changed as follows. The instance
of \TYPO3\
will be passed as an argument to the constructor.
class MyClass
{
/**
* @var TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
*/
private $cache;
public function __construct(FrontendInterface $cache)
{
$this->cache = $cache;
}
}
Since the auto-wiring feature of the dependency injection container cannot detect,
which cache configuration should be used for the $cache
argument, the container
service configuration needs to be extended as well:
services:
cache.my_cache:
class: TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
factory: ['@TYPO3\CMS\Core\Cache\CacheManager', 'getCache']
arguments: ['my_cache']
MyClass:
arguments:
$cache: '@cache.my_cache'