Migration Guide
This guide covers migrating from previous versions of the Contexts extension.
Migrating from v4.x to v5.0
Version 5.0 targets TYPO3 v13.4 LTS and v14.3 LTS and completes the removal of the frontend APIs that TYPO3 dropped in v13 and v14.
Breaking Changes
TYPO3 Version
Before: TYPO3 v12.4 LTS and v13.4 LTS
After: TYPO3 v13.4 LTS and v14.3 LTS
TYPO3 v12.4 is no longer supported. Use version 4.x for TYPO3 v12.4 installations.
Removed API
The following methods were bound to the TypoScriptFrontendController hooks
removed in TYPO3 v13.0 (forge#102932) and are gone:
| Removed | Replacement |
|---|---|
FrontendControllerService::registerQueryParameter() |
\Netresearch\ |
FrontendControllerService::createHashBase() | PageCacheIdentifierEventListener |
FrontendControllerService::configArrayPostProc() | TypoScriptConfigEventListener |
PageService::createHashBase() | PageService::getHashString() |
CacheHashEventListener (empty stub) | PageCacheIdentifierEventListener |
Custom context types that extend
\Netresearch\ are affected by the removal
of the TypoScriptFrontendController
(forge#107831) and of
General
(deprecated in TYPO3 v14.3):
| Removed protected method | Replacement |
|---|---|
getTypoScriptFrontendController() | getRequest() / getFrontendUser() |
getIndpEnv() | getNormalizedParams() |
Fixed Behaviour
Four defects are fixed by this release:
- The session context and the
use_sessionpersistence of the GET parameter context read the frontend user from the removedTypoScriptFrontendController. They now read thefrontend.userrequest attribute and match again. - Context-aware page caching and
config.linkVarswere registered on hooks removed in TYPO3 v13.0, so every context variant of a page shared one page cache entry and the switching GET parameter was dropped from generated links. They now use\TYPO3\andCMS\ Frontend\ Event\ Before Page Cache Identifier Is Hashed Event \TYPO3\.CMS\ Frontend\ Event\ Modify Typo Script Config Event - The FlexForm of the context type configuration was selected via
ds_pointerField, removed in TYPO3 v14.0 (forge#107047). On v14.3 every read oftx_contexts_contexts.type_confthrew anInvalidTcaException, so context records could neither be rendered nor saved. See FlexForm Data Structure. - Frontend caches are invalidated when a context record changes. The
result of
Modifyis cached under an identifier derived from the TypoScript sources, so a new or renamed GET parameter context previously did not reachTypo Script Config Event config.linkVarsuntil the caches were flushed by hand. See Caching Considerations.
Removed Site Set Settings
contexts.matchMode and contexts.cacheLifetimeModifier have been removed
from Configuration/Sets/Contexts/. Neither setting was ever read by the
extension. Remove them from your site configuration; there is no replacement.
contexts.debug is unchanged.
Removed Files
ext_tables.php has been removed - it only held a TYPO3 v12 code path and the
file itself is deprecated since TYPO3 v14.3 (forge#109438). The v13+
equivalent lives in Configuration/TCA/tx_contexts_contexts.php via
ctrl.security.ignorePageTypeRestriction.
$GLOBALS['TYPO3_CONF_VARS']['FE']['addRootLineFields'] is no longer written
in ext_localconf.php; the setting was removed in TYPO3 v13.2
(forge#103752) and rootline relations on pages are always resolved since.
Step-by-Step Migration
- Update TYPO3 to v13.4 or v14.3
-
Update extension via Composer:
composer require netresearch/contexts:^5.0Copied! -
Clear all caches:
vendor/bin/typo3 cache:flushCopied! - Review custom context types for the removed protected methods listed above
Migrating from v3.x to v4.0
Version 4.0 introduces significant changes for TYPO3 v12/v13 compatibility.
Breaking Changes
PHP Version
Before: PHP 7.4 - 8.1
After: PHP 8.2+
Update your deployment and CI pipelines accordingly.
TYPO3 Version
Before: TYPO3 v11
After: TYPO3 v12.4 LTS and v13.4 LTS only
TYPO3 v11 and earlier are no longer supported. Use version 3.x for older TYPO3 installations.
Hook Migration
All SC_OPTIONS hooks have been replaced with PSR-14 events.
Before (v3.x):
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']
['processDatamapClass'][] = MyHook::class;
After (v4.0):
#[AsEventListener(
identifier: 'my-extension/datahandler',
event: AfterDatabaseOperationsEvent::class
)]
final class MyEventListener { ... }
Dependency Injection
Services must now be properly configured for dependency injection.
Before: Direct instantiation or makeInstance()
After: Constructor injection via Services.yaml
services:
Vendor\MyExtension\Service\MyService:
public: true
Step-by-Step Migration
- Update PHP version to 8.2 or higher
- Update TYPO3 to v12.4 or v13.4
-
Update extension via Composer:
composer require netresearch/contexts:^4.0Copied! -
Run database migrations:
vendor/bin/typo3 database:updateschemaCopied! -
Clear all caches:
vendor/bin/typo3 cache:flushCopied! - Review custom context types - update to new interface if needed
- Migrate hooks to events - see Event Migration below
Event Migration Reference
| Old Hook (SC_OPTIONS) | New PSR-14 Event |
|---|---|
| hook_checkEnableFields | AfterPageAndLanguageIsResolvedEvent |
| filterMenuPages | FilterMenuItemsEvent |
| overrideIconOverlay (IconFactory) | ModifyRecordOverlayIconIdentifierEvent |
| createHashBase | BeforePageCacheIdentifierIsHashedEvent (since v5.0) |
| configArrayPostProc | ModifyTypoScriptConfigEvent (since v5.0) |
Adopting Site Sets (Optional)
TYPO3 v13 introduces Site Sets as the modern way to manage site configuration. This is optional and backward compatible.
Benefits of Site Sets
- Cleaner site configuration
- Composable settings
- Better multi-site management
- IDE autocompletion for settings
Migration Steps
-
In your site configuration, add the contexts set:
imports: - { resource: "EXT:contexts/Configuration/Sets/Contexts/config.yaml" }Copied! -
Configure settings in your site configuration:
settings: contexts: debug: falseCopied! - Remove any static TypoScript include (no longer needed with Site Sets)
Updating Tests
Test code must be updated for PHPUnit 10/11/12/13 compatibility.
Annotation to Attribute Migration
Before:
/**
* @test
* @dataProvider myProvider
*/
public function myTest(): void { }
After:
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\Attributes\DataProvider;
#[Test]
#[DataProvider('myProvider')]
public function myTest(): void { }
Deprecated Methods
The $this->at() method is removed. Use explicit mock configuration:
Before:
$mock->expects($this->at(0))->method('foo')->willReturn('a');
$mock->expects($this->at(1))->method('foo')->willReturn('b');
After:
$mock->expects($this->exactly(2))
->method('foo')
->willReturnOnConsecutiveCalls('a', 'b');
Troubleshooting
Common Issues
"Class not found" errors:
Clear all caches and ensure Composer autoload is regenerated:
composer dump-autoload
vendor/bin/typo3 cache:flush
Context not matching:
Enable debug mode to see matching details:
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['contexts']['debug'] = true;
Backend module missing:
Ensure the extension is properly activated:
vendor/bin/typo3 extension:activate contexts
Getting Help
- GitHub Issues: https://github.com/netresearch/t3x-contexts/issues
- TYPO3 Slack: #ext-contexts channel