cacheDataCollector; $this->cacheDataCollector = new CacheDataCollector(); $request = $request->withAttribute('frontend.cache.collector', $this->cacheDataCollector); $response = $handler->handle($request); if ($this->isDebugModeEnabled()) { $cacheTags = array_map(fn(CacheTag $cacheTag) => $cacheTag->name, $this->cacheDataCollector->getCacheTags()); sort($cacheTags); foreach (explode("\n", wordwrap(implode(' ', $cacheTags), self::MAX_CACHE_TAGS_HEADER_LENGTH, "\n")) as $delta => $tags) { $response = $response->withHeader('X-TYPO3-Cache-Tags' . ($delta > 0 ? '-' . $delta : ''), $tags); } $response = $response->withHeader('X-TYPO3-Cache-Lifetime', (string)$this->cacheDataCollector->resolveLifetime()); } foreach ($this->cacheDataCollector->getCacheEntries() as $deferredCacheItem) { $deferredCacheItem($request); } $this->cacheDataCollector = $backup; return $response; } #[AsEventListener] public function onCacheTagAdded(AddCacheTagEvent $event): void { // This event listener is a tribute to code places that want to add cache tags, // but don't have the request available to set cache tags on the attribute directly. // TYPO3 core will try to get rid of these places over time, but needs this event // listener for now. $this->cacheDataCollector?->addCacheTags($event->cacheTag); } private function isDebugModeEnabled(): bool { return !empty($GLOBALS['TYPO3_CONF_VARS']['FE']['debug']); } }