Breaking: #107578 - Event AfterCacheableContentIsGeneratedEvent changed 

See forge#107578

Description 

The frontend rendering related event AfterCacheableContentIsGeneratedEvent had to be changed due to the removal of class TypoScriptFrontendController: Method getController() is removed and substituted with methods getContent() and setContent().

Impact 

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

Affected installations 

The event is relatively commonly used within frontend rendering related extensions since it gives an opportunity to get and manipulate the fully rendered Response body content at a late point in the rendering chain.

Instances with extensions listening for event AfterCacheableContentIsGeneratedEvent may be affected. The extension scanner will find affected extensions.

Migration 

In most cases, method AfterCacheableContentIsGeneratedEvent->getController() is used in event listeners to get and/or set TypoScriptFrontendController->content at a late point within the frontend rendering chain.

The event has been changed by removing getController() and adding getContent() and setContent() instead.

Example before:

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

Example now:

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

Extensions aiming for TYPO3 v13 and v14 compatibility in a single version can use a version check gate:

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