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\CMS\Core\Cache\CacheManager
is available as a service within
the dependency injection container. To foster the „Inversion of Control“ pattern,
the instances of \TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
should
be injected to the objects rather than using the \TYPO3\CMS\Core\Cache\CacheManager
.
Classes should be adapted to avoid \TYPO3\CMS\Core\Cache\CacheManager
whenever possible.
The TYPO3 core provides all core caches as dependency injection services.
The name of the service follows the scheme cache.[CONFIGURATION NAME]
.
E.g. the core cache frontend will have the service id cache.core
.
Third party extensions are encouraged to do the same and provide a cache.my_cache
service in Configuration/Services.yaml
for cache configuration they define
in ext_localconf.php
.
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\CMS\Core\Cache\Frontend\FrontendInterface
was retrieved by creating an instance
of \TYPO3\CMS\Core\Cache\CacheManager
and then by calling the getCache()
method.
To inject the cache directly, the class needs to be changed as follows. The instance
of \TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
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'