---
title: "Breaking: #107578 - Event AfterCacheableContentIsGeneratedEvent changed"
manual: "TYPO3 Core Changelog"
version: "main"
permalink: "https://docs.typo3.org/permalink/changelog:breaking-107578-1759400756"
source: "Changelog/14.0/Breaking-107578-EventAfterCacheableContentIsGeneratedEventChanged.rst"
typo3-version: "14.0"
typo3-major: 14
type: "breaking"
issue: 107578
forge: "https://forge.typo3.org/issues/107578"
tags: ["PHP-API", "FullyScanned", "ext:frontend"]
rendered: "2026-09-20T18:31:11+00:00"
---

# Breaking: #107578 - Event AfterCacheableContentIsGeneratedEvent changed {#breaking-107578-1759400756}

See [forge#107578](https://forge.typo3.org/issues/107578)

## Description {#description}

The frontend rendering event
`\TYPO3\CMS\Frontend\Event\AfterCacheableContentIsGeneratedEvent`
has been adjusted due to the removal of the
`TypoScriptFrontendController` class.

The method `getController()` has been removed and replaced by two new
methods: `getContent()` and `setContent()`.

## Impact {#impact}

Event listeners that call `getController()` will trigger a fatal PHP
error and must be adapted.

## Affected installations {#affected-installations}

This event is commonly used in frontend rendering–related extensions, since
it provides an opportunity to access and manipulate the fully rendered
response body content at a late point in the rendering chain.

Instances with extensions listening to
`AfterCacheableContentIsGeneratedEvent` may be
affected. The extension scanner will detect such usages.

## Migration {#migration}

In most cases, `AfterCacheableContentIsGeneratedEvent->getController()` was
used within event listeners to get and modify the
`TypoScriptFrontendController->content` property at the end of the
rendering process.

The event now provides `getContent()` and `setContent()` methods
to achieve the same goal more directly.

**Before:**

```php
#[\TYPO3\CMS\Core\Attribute\AsEventListener('my-extension')]
public function indexPageContent(
    \TYPO3\CMS\Frontend\Event\AfterCacheableContentIsGeneratedEvent $event
): void {
    $tsfe = $event->getController();
    $content = $tsfe->content;
    // ... $content is manipulated here
    $tsfe->content = $content;
}
```

**After:**

```php
use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Frontend\Event\AfterCacheableContentIsGeneratedEvent;

#[AsEventListener('my-extension')]
public function indexPageContent(AfterCacheableContentIsGeneratedEvent $event): void
{
    $content = $event->getContent();
    // ... $content is manipulated here
    $event->setContent($content);
}
```

**Version check for TYPO3 v13/v14 compatibility:**

```php
use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Core\Information\Typo3Version;
use TYPO3\CMS\Frontend\Event\AfterCacheableContentIsGeneratedEvent;

#[AsEventListener('my-extension')]
public function indexPageContent(
    AfterCacheableContentIsGeneratedEvent $event
): void {
    $version = new Typo3Version();
    if ($version->getMajorVersion() < 14) {
        // @todo: Remove if() when TYPO3 v13 compatibility is dropped
        $tsfe = $event->getController();
        $content = $tsfe->content;
    } else {
        $content = $event->getContent();
    }

    // ... $content is manipulated here

    if ($version->getMajorVersion() < 14) {
        // @todo: Remove if() when TYPO3 v13 compatibility is dropped
        $tsfe = $event->getController();
        $tsfe->content = $content;
    } else {
        $event->setContent($content);
    }
}
```
