---
title: "Deprecation: #109438 - ext_tables.php in extensions"
manual: "TYPO3 Core Changelog"
version: "main"
permalink: "https://docs.typo3.org/permalink/changelog:deprecation-109438-1774951763"
source: "Changelog/14.3/Deprecation-109438-ExtTablesPhpInExtensions.rst"
typo3-version: "14.3"
typo3-major: 14
type: "deprecation"
issue: 109438
forge: "https://forge.typo3.org/issues/109438"
tags: ["PHP-API", "NotScanned", "ext:core"]
rendered: "2026-10-01T19:27:47+00:00"
---

# Deprecation: #109438 - ext_tables.php in extensions {#deprecation-109438-1774951763}

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

## Description {#description}

Extensions that still ship an `ext_tables.php` file will now trigger
a PHP `E_USER_DEPRECATED` error when the file is loaded during
a non-cached request or cache warm-up.

The `ext_tables.php` file was historically used to register backend
modules, page doktypes, user settings, and other runtime configuration.
All of these use cases now have dedicated alternatives in modern TYPO3:

-   Backend modules: `Configuration/Backend/Modules.php`
-   Backend routes: `Configuration/Backend/Routes.php`
-   User settings: `Configuration/TCA/Overrides/be_users.php`
    (see [forge#108843](https://forge.typo3.org/issues/108843))
-   Page doktype allowed record types: `Configuration/TCA/Overrides/pages.php`
    (see [forge#108557](https://forge.typo3.org/issues/108557))

## Impact {#impact}

A PHP `E_USER_DEPRECATED` error is triggered for every third-party
extension that still provides an `ext_tables.php` file whenever
`ext_tables.php` files are loaded without caching, for example during
cache warm-up or in a development context.

Support for `ext_tables.php` will be removed in TYPO3 v15.0.

## Affected installations {#affected-installations}

All installations with third-party extensions that still ship an
`ext_tables.php` file.

## Migration {#migration}

Move all registration from `ext_tables.php` to the appropriate
configuration files.

### User settings {#user-settings}

User settings previously registered via
`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToUserSettings()` in
`ext_tables.php` should now be registered via
`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addUserSetting()` in
`Configuration/TCA/Overrides/be_users.php`.

Before:

**ext_tables.php**

```php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;

$GLOBALS['TYPO3_USER_SETTINGS']['columns']['myCustomSetting'] = [
    'type' => 'check',
    'label' => 'LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:myCustomSetting',
];
ExtensionManagementUtility::addFieldsToUserSettings(
    'myCustomSetting',
    'after:emailMeAtLogin'
);
```

After:

**Configuration/TCA/Overrides/be_users.php**

```php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;

ExtensionManagementUtility::addUserSetting(
    'myCustomSetting',
    [
        'label' => 'LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:myCustomSetting',
        'config' => [
            'type' => 'check',
            'renderType' => 'checkboxToggle',
        ],
    ],
    'after:emailMeAtLogin'
);
```

### Page doktype allowed record types {#page-doktype-allowed-record-types}

Page doktypes previously registered via `PageDoktypeRegistry->add()` in
`ext_tables.php` should now use the TCA option
`allowedRecordTypes` in `Configuration/TCA/Overrides/pages.php`.

Before:

**ext_tables.php**

```php
\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
    \TYPO3\CMS\Core\DataHandling\PageDoktypeRegistry::class
)->add(116, [
    'allowedTables' => ['tt_content', 'my_custom_record'],
]);
```

After:

**Configuration/TCA/Overrides/pages.php**

```php
$GLOBALS['TCA']['pages']['types']['116']['allowedRecordTypes'] = [
    'tt_content',
    'my_custom_record',
];
```

Once all registrations have been moved, the `ext_tables.php` file
can be removed from the extension.
