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');
    }
}
Copied!

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;
    }
}
Copied!

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'
Copied!