40+ Enhancement in TYPO3 v10 for Developers: Series 5

Welcome to the last blog of the TYPO3 v10 Features Series! The TYPO3 developers are the key people who are developing and maintaining either the whole system or custom TYPO3 extensions solutions. TYPO3 Core team and Community working hard for a year to give developer-friendly CMS.

40+ Enhancement in TYPO3 v10 for Developers: Series 5

Welcome to the last blog of the TYPO3 v10 Features Series! The TYPO3 developers are the key people who are developing and maintaining either the whole system or custom TYPO3 extensions solutions.

TYPO3 Core team and Community working hard for a year to give developer-friendly CMS. And, TYPO3 v10 release party, although most of the parties were canceled due to COVID-19, I recommend you to read this blog. IMHO, In COVID-19, It's the right time to learn, explore and contribute to the TYPO3 community. So, Get ready to Upgrade TYPO3 From the old version and Get ready to know in-depth about TYPO3 v10.

We have published a Blog series for TYPO3 v10 for TYPO3 Editors, Integrators, Integrators, and Developers.

Now, as being a TYPO3 developer it’s our responsibility to always follow the latest standards. How can you help the TYPO3 community?

  • Always follow latest TYPO3 technologies and coding standards
  • Report bug/issue to TYPO3 team
  • Check change log and deprecation
  • Regularly update and make compatible your TYPO3 extensions at TER for community

Get ready to see some of the new features of TYPO3 v10 which will be useful as a TYPO3 Developer.

Step-by-step Guide and Feature-list for Developers in TYPO3 v10

TYPO3 v10 has introduced some of the new TYPO3 features as well as improvements to existing TYPO3 features.

Checkout one-by-one major features that will help TYPO3 Developers as follows.

1. Dashboard - Create Your Own Widget

Source: https://typo3.org/

Developers can create custom widgets for the Dashboard by extending one of the following widget abstracts:

  • AbstractWidget: A basic abstract that can be used as the start of simple widgets.
  • AbstractRssWidget: An abstract to create a widget that shows an RSS feed.
  • AbstractListWidget: An abstract to create a widget that shows a list of items.
  • AbstractCtaButtonWidget: An abstract to create a widget that shows a "call-to-action" button.

Step 1. Register your widgets


Option 1: widget identifier as attribute

        name: dashboard.widget
        identifier: widget-identifier-1
        widgetGroups: ’general’

Option 2: custom service name allows multiple widget identifier to share one class

class: Vendor\MyExtension\Widgets\MySecondWidget
        name: dashboard.widget
        identifier: widget-identifier-2
        widgetGroups: ’general, typo3’

Step 2. Widget Groups

Every widget is attached to one or more widget groups. Those groups are shown in the modal when adding a new widget to your dashboard. Developers can configure custom widget groups by creating a file.

    return [
    ’widgetGroup-exampleGroup’ => [
        ’title’ => ’LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:widget_group_name’,

Step 3: Automatically create a dashboard for new users

options.dashboard.dashboardPresetsForNewUsers = default, dashboardPreset-myOwnPreset

2. Fix Breaking Changes

In TYPO3 v9, some PHP classes, interfaces, class aliases, properties, methods, constants, global options and variables, etc. were marked Deprecated.

In accordance with TYPO3's deprecation policy, these components have been removed in TYPO3 v10.0. How can you make sure that all your functionality works without breaking? Perform the following steps.

Source: https://typo3.org/

  • Step 1.Enable deprecation log
  • Step 2.Use Extension Scanner for code-review and get a full report of incompatibilities of your custom extensions.

3. New Mail API

SwiftMailer has been superseded by more modern libraries:

symfony/mime // for creating mail messages
symfony/mailer // for sending emails

PHP function mail() is no longer supported. It is recommended to switch to sendmail or smtp instead.

$email = GeneralUtility::makeInstance(MailMessage::class)
->to(new Address('kasperYYYY@typo3.org'), new Address('benni@typo3.org', 'Benni Mack'))
->subject('This is an example email')
->text('This is the plain-text variant')
->html('Hello Benni.
Enjoy a HTML-readable email. We love TYPO3.');


4. Fluid-based Email Templating

TYPO3 now supports sending template-based emails for multi-part and HTML-based emails out-of-the-box. The email contents are built with Fluid Templating Engine.

$GLOBALS['TYPO3_CONF_VARS']['MAIL']['templateRootPaths'][700] = 'EXT:my_site_extension/Resources/Private/Templates/Email';
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['layoutRootPaths'][700] = 'EXT:my_site_extension/Resources/Private/Layouts';

    ->from(new Address('jeremy@acme.com', 'Jeremy'))
    ->subject('TYPO3 loves you - here is why')
    ->setFormat('html') // only HTML mail
    ->assign('mySecretIngredient', 'Tomato and TypoScript');

<f:section name="Subject"> New Login at "{typo3.sitename}"</f:section>

5. Symfony Dependency Management/Injection

The package symfony/dependency-injection has been integrated and is used to manage system-wide dependency management and dependency injection for classes.

Configuration options include:

# Configuration/Services.yaml
        autowire: true
        autoconfigure: true
        public: false
        resource: ’../Classes/*’

6. Event Dispatching

A new "EventDispatcher" system has been added which aims to replace the hooks and Signal/Slots concepts.

It is based on the PSR-14 standard which allows developers to inject logic into an application easily and consistently.

Step 1. Configuration/Services.yaml

        - { name: event.listener, identifier: ’myListener’, event: TYPO3\CMS\Core\Mail\Event\
        AfterMailerInitializationEvent, before: ’redirects, anotherIdentifier’ }

Step 2. Implement your event object

List of available Event Listeners can be accessed in the backend: (requires system extension EXT:lowlevel)

7. BitSet Class

New class has been introduced to efficiently handle boolean ags:


define(’PERMISSIONS_javascript’, 0b0); // 0
define(’PERMISSIONS_PAGE_SHOW’, 0b1); // 1
define(’PERMISSIONS_PAGE_EDIT’, 0b10); // 2
define(’PERMISSIONS_PAGE_DELETE’, 0b100); // 4
define(’PERMISSIONS_PAGE_NEW’, 0b1000); // 8
define(’PERMISSIONS_CONTENT_EDIT’, 0b10000); // 16
define(’PERMISSIONS_ALL’, 0b11111); // 31

$bitSet->get(PERMISSIONS_PAGE_SHOW); // true
$bitSet->get(PERMISSIONS_CONTENT_EDIT); // false

8. Register TYPO3 Plugins/Modules

Registering plugins/modules require fully-qualified class names now


Also omit vendor name in the extension name (first argument). Use "ExampleBlog" instead of "Vendor.ExampleBlog".

For example:

    ’ExampleBlog’, // previously: ’Vendor.ExampleBlog’
        \Vendor\Example\Controller\BlogController::class => ’list,update,delete’
        \Vendor\Example\Controller\BlogController::class => ’list,update,delete’

9. Extbase Models DockBlocks

Extbase models now supports non fully-qualified class names in DocBlocks.

use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
use ExtbaseTeam\BlogExample\Domain\Model\Comment;
class Post
    * @var ObjectStorage
    public $comments;

10. Register Extbase Validators

Validators are not registered automatically in Extbase anymore. Validators need to be registered manually now.

Eg, For a model named Vendor\Example\Domain\Model\Blog, Extbase automatically used the validator

use Vendor\Example\Domain\Model\Blog;
use TYPO3\CMS\Extbase\Annotation as Extbase;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;

class BlogController extends ActionController
    * @Extbase\Validate(param="blog", validator="Vendor\Example\Domain\Validator\BlogValidator")

    public function showAction(Blog $blog)
        // ...

11. Notification Actions

JavaScript notifications in the backend support actions (buttons) now.

], function(ImmediateAction, DeferredAction, Notification) {
    const immediateActionCallback = new ImmediateAction(function () { /* your action code */ });
            'Great! We are almost done here...',
            'Common default settings have been applied based on your previous input.',
            {label: 'Show settings', action: immediateActionCallback}

12. New-way of Class Mapping

Persistence related class mapping using TypoScript is no longer supported eg., config.tx_example_blog.persistence.classes..

# Configuration/Extbase/Persistence/Classes.php:

    declare(strict_types = 1);
        return [
            \Vendor\Example\Domain\Model\Author::class => [
                ’tableName’ => ’fe_users’,
                ’properties’ => [
                ’fullname’ => [
                ’fieldName’ => ’name’

13. Cache Dependency Injection

Extension developers are encouraged to inject caches directly rather than using the CacheManager.


class MyClass
    * @var TYPO3\CMS\Core\Cache\Frontend\FrontendInterface

    private $cache;
    public function __construct()
        $cacheManager = GeneralUtility::makeInstance(CacheManager::class);
        $this->cache = $cacheManager->getCache(’my_cache’);


class MyClass
    * @var TYPO3\CMS\Core\Cache\Frontend\FrontendInterface

    private $cache;
    public function __construct(FrontendInterface $cache)
        $this->cache = $cache;

...and the following container service con guration is required:

    class: TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
    factory: [’@TYPO3\CMS\Core\Cache\CacheManager’, ’getCache’]
    arguments: [’my_cache’]
    $cache: ’@cache.my_cache’

14. PSR-17 HTTP Message Factories

The PSR-17 HTTP Message Factories implementation has been added. HTTP Message Factory interfaces should be used as dependencies for request handlers or services that create PSR-7 message objects.

// PSR-17 consists of six factory interfaces:

15. PSR-18 HTTP Client

The PSR-18 HTTP Client implementation has been added. It lets developers generate HTTP requests based on PSR-7 message objects without relying on a specific HTTP client implementation.

// PSR-18 consists of a client interface and three exception interfaces:

16. Custom File Processors

Developers can now register their own processors like you want to add a watermark to images.

// ext_localconf.php
$GLOBALS[’TYPO3_CONF_VARS’][’SYS’][’fal’][’processors’][’ExampleImageProcessor’] = [
    ’className’ => \Vendor\MyExtension\Resource\Processing\ExampleImageProcessor::class,
    ’before’ => ’LocalImageProcessor’,

17. Include YAML files

YAML files can already be included by other YAML les using the following syntax:

    - { resource: "EXT:my_extension/Configuration/FooBar/Example.yaml" }
    option: true

This has been extended to import resources relative to the current YAML file

    - { resource: "subfolder/AnotherExample.yaml" }
    - { resource: "../path/to/configuration/AnotherExample.yaml" }
    option: true

18. f:widget ViewHelper

Widget ViewHelpers set a session cookie in the frontend under certain circumstances. As this is not always desired (for example due to GDPR), this can be controlled now.

A boolean storeSession has been introduced that lets developers enable/disable this feature.

<f:widget.autocomplete for="name" objects="{posts}" searchProperty="author" storeSession="false" />

19. PSR-14 Events in the TYPO3 Core

A number of new PSR-14 Events replace Signal/Slots in the TYPO3 core:


20. Introduced PageTsConfigLoader and PageTsConfigParser

Two new PHP classes have been introduced to load and parse PageTSconfig:


For example:

// Fetch all available PageTS of a page/rootline:
$loader = GeneralUtility::makeInstance(PageTsConfigLoader::class);
$tsConfigString = $loader->load($rootLine);

// Parse the string and apply conditions:
$parser = GeneralUtility::makeInstance(
PageTsConfigParser::class, $typoScriptParser, $hashCache
$pagesTSconfig = $parser->parse($tsConfigString, $conditionMatcher);

21. Site Language Awareness

A SiteLanguageAwareInterface has been introduced. The interface can be used to denote a class as aware of the site language.

Routing aspects, that take the site language into account, are now using the SiteLanguageAwareInterface in addition to the SiteLanguageAwareTrait.

22. Removed System Log API

The following options have been removed from TYPO3's default configuration, Extension authors are advised to use the Logging API and remove the systemLog options.


23. Introduction to Pagination Feature

Native support for the pagination of lists such as arrays or QueryResults of Extbase has been introduced.

The PaginatorInterface holds a basic set of methods. The AbstractPaginator class holds the main pagination logic. This enables developers to implement all kinds of paginators.

use TYPO3\CMS\Core\Pagination\ArrayPaginator;

$items = [’apple’, ’banana’, ’strawberry’, ’raspberry’, ’ananas’];
$currentPageNumber = 3;
$itemsPerPage = 2;

$paginator = new ArrayPaginator($itemsToBePaginated, $currentPageNumber, $itemsPerPage);
$paginator->getNumberOfPages(); // returns 3
$paginator->getCurrentPageNumber(); // returns 3
$paginator->getKeyOfFirstPaginatedItem(); // returns 5
$paginator->getKeyOfLastPaginatedItem(); // returns 5

24. Edit Only Specific Field: ViewHelper editRecord

An optional argument field has been added to the uri.editRecord and link.editRecord ViewHelpers. If set, the FormEngine creates a form to only edit the given database field(s).

The following example creates a link to edit the tt_content.bodytext field of record with the UID 42.

<code class="language-markup"><be:link.editRecord uid="42" table="tt_content" fields="bodytext" returnUrl="foo/bar">
    Edit record

25. Add Custom JS/CSS through Fluid

The initial steps of integrating an AssetCollector have been implemented. The concept allows developers to add custom CSS/JS code (inline or external) multiple times, but TYPO3 outputs it only once.

In this regards, two new Fluid ViewHelpers have been added:

<f:asset.css identifier="identifier123" href="EXT:my_ext/Resources/Public/Css/foo.css" />
<f:asset.css identifier="identifier123">
    .foo { color: black; }

<f:asset.script identifier="identifier123" src="EXT:my_ext/Resources/Public/JavaScript/foo.js" />
<f:asset.script identifier="identifier123">
    alert('hello world');
->addJavaScript('my_ext_foo', 'EXT:my_ext/Resources/Public/JavaScript/foo.js', ['data-foo' => 'bar']])

In the long run, the AssetCollector aims to replace the various existing TypoScript options that are rather confusing.

26. Allow to Change hreflang-tag

It is now possible to modify hreflang tags before they get rendered. Developers can achieve this by registering an event listener for the following event:


27. CKEditor: Customization

The following PSR-14-based events have been introduced which allow to modify the CKEditor configuration:



// EXT:my_extension/Configuration/Services.yaml
    - name: event.listener
        identifier: 'ext-myextension/rteConfigEnhancer'
        method: 'beforeGetExternalPlugins'
        event: TYPO3\CMS\RteCKEditor\Form\Element\Event\BeforeGetExternalPluginsEvent
    - name: event.listener
        identifier: 'ext-myextension/rteConfigEnhancer'
        method: 'beforePrepareConfiguration'
// EXT:my_extension/Classes/EventListener/RteConfigEnhancer.php
namespace Vendor\MyExtension\EventListener;

use TYPO3\CMS\RteCKEditor\Form\Element\Event\BeforeGetExternalPluginsEvent;
use TYPO3\CMS\RteCKEditor\Form\Element\Event\BeforePrepareConfigurationForEditorEvent;

class RteConfigEnhancer
    public function beforePrepareConfiguration(BeforePrepareConfigurationForEditorEvent $event): void
        $data = $event->getData();
        // @todo make useful decisions on fetched data
        $configuration = $event->getConfiguration();
        $configuration['extraPlugins'][] = 'example_plugin';

28. Admin Panel Gets PSR-14 Events

The Admin Panel shows all PSR-14 events that have been dispatched in the current request.

29. Forget jQuery for AJAX Implementation: Fetch API

The Fetch API has been introduced to perform AJAX requests and to make TYPO3 less dependent on jQuery.

The API provides a generic definition of Request and Response objects (and other things involved with network requests).

Example of GET requests

require(['TYPO3/CMS/Core/Ajax/AjaxRequest'], function (AjaxRequest) {
const request = new AjaxRequest('https://httpbin.org/json');
        async function (response) {
            const data = await response.resolve();
        }, function (error) {
            console.error('Request failed because of error: ' + error.status + ' ' + error.statusText);

30. Action Buttons in Modals

Modal popups now support action buttons. As an alternative to the existing trigger option, the new option action can be used.

For example:

Modal.confirm(’Header’, ’Some content’, Severity.error, [
        text: ’Based on trigger()’,
        trigger: function () {
        text: ’Based on action()’,
        action: new DeferredAction(() => {
            return new AjaxRequest(’/any/endpoint’).post({});

31. JavaScript Events API

More and more JavaScripts core APIs are launching to avoid unnecessary other frameworks like jQuery. A new Event API enables JavaScript developers to have a stable event listening interface.

require(['TYPO3/CMS/Core/Event/RegularEvent'], function (RegularEvent) {
    new RegularEvent('click', function (e) {
        // Do something

32. Allow Get Default Value of Class

It is now possible to get the default value of a class property when using the TYPO3\CMS\Extbase\Reflection\ReflectionService.

class MyClass
    public $myProperty = 'foo';

$property = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Reflection\ReflectionService::class)

$defaultValue = $property->getDefaultValue(); // "foo"

33. Render fieldControl for SelectSingleElement

It is now possible to use the fieldControl option for SelectSingleElements to add nodes and wizards. For example, add a link popup button to a select called “field_name” of the pages table:

$GLOBALS['TCA']['pages']['columns']['field_name']['config']['fieldControl']['linkPopup'] = [
    'renderType' => 'linkPopup',

34. Customize special page icons by docktype

The page icon in the pagetree can now be fully customized for own docktypes.

    'ctrl' => [
        'typeicon_classes' => [
        '123' => "your-icon",
        '123-contentFromPid' => "your-icon-contentFromPid",
        '123-root' => "your-icon-root",
        '123-hideinmenu' => "your-icon-hideinmenu",

35. Custom icons for Record-browser

The icons for the record browser button can now be customized.

                                    # ...
                                    identifier: contentElement
                                    # ...
                                    browsableType: tt_content
                                    iconIdentifier: mimetypes-x-content-text
                                    propertyPath: properties.contentElementUid
                                    # ...

37. EXT:felogin Hook to Validate Password

Now we can easily validate password through EXT:felogin hook

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['felogin']['password_changed'][] = \Your\Namespace\Hooks\MyBeautifulHook::class . '->passwordChanged';

public function passwordChanged(array &$params)
        $params['passwordInvalidMessage']='Do not use password as password';

38. Import Environment Variables into Sites

Environment variables are now resolved in imports of site configuration YAML files.

    resource: 'Env_%env("foo")%.yaml'

39. $queryBuilder->set() Get Fourth Argument

TYPO3\CMS\Core\Database\Query\QueryBuilder::set() accepts as additional fourth parameter a type the query value should be casted to when the third parameter (createNamedParameter) is true. Per default string (\PDO::PARAM_STR) is used.

$queryBuilder-$gt;set($fieldName, $fieldValue, true, \PDO::PARAM_INT);

40. Configuration for ipLocking

Added more configuration for New Locking API

// typo3conf/AdditionalConfiguration.php
$GLOBALS['TYPO3_CONF_VARS']['SYS']['locking']['strategies'][\TYPO3\CMS\Core\Locking\FileLockStrategy::class]['priority'] = 10;
// The directory specified here must exist und must be a subdirectory of `Environment::getProjectPath()`
$GLOBALS['TYPO3_CONF_VARS']['SYS']['locking']['strategies'][\TYPO3\CMS\Core\Locking\FileLockStrategy::class]['lockFileDir'] = 'mylockdir';  

// Your Class
public static function getPriority()
    return $GLOBALS['TYPO3_CONF_VARS']['SYS']['locking']['strategies'][self::class]['priority']
    ?? self::DEFAULT_PRIORITY;

41. CLI scheduler:run Command Allows Multiple Tasks

The new feature allows the execution of tasks in a given order. This can be used to debug side effects between tasks that are executed within the same scheduler run.

./typo3/sysext/core/bin/typo3 scheduler:run --task 1 --task 2

42. Introduce CacheHashConfiguration

Settings for $GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash'] are modelled in class CacheHashConfiguration which takes care of validating configuration. It also determines whether corresponding aspects apply to a given URL parameter.

$GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash'] = [
    'excludedParameters' => [
        '^utm_', // making previous two obsolete
    'excludedParametersIfEmpty' => [

43. Security: Status Reports

The DebugExceptionHandler possibly outputs sensitive data that could result in an information disclosure vulnerability. A new status report has been introduced to warn administrators.

WARNING, if the context is set to development and the error output is enabled:

ERROR, if the context is set to production and the error output is enabled:

44. Security: Password Hash Algorithms

The hashing algorithm Argon2i ("i") was introduced with TYPO3 v9 LTS.

  • Argon2id ("id") is now also available in TYPO3 if the PHP version supports it.
  • Argon2id is a hybrid of Argon2i and Argon2d and is more resistant against side-channel attacks.
  • Argon2id is typically available on systems with PHP version 7.3 or higher.

AtoZ About TYPO3 v10

What’s New Slides

All the above features and screenshot has been taken from What’s New Slides. We recommend to check out those slides to know AtoZ like deprecation, TypoScript, Fluid and PHP code-level changes, etc.

Change Log of TYPO3 v10

You can also get detailed change-log of TYPO3 v10 at



That’s it!

I hope you enjoyed and liked our blog with insight details of TYPO3 v10.

Here is the quick recap which you should go through for TYPO3 v10.

  • Be passionate with vibrant TYPO3 community - Get prepared for TYPO3 v10
  • Try TYPO3 v10 and write feedback to the TYPO3 core team & community
  • Keep practicing and developing the next website with TYPO3 v10 LTS standards
  • Update your TYPO3 extensions with TYPO3 v10 at TER.
  • Go through practically each TYPO3 features and code-level which will help you as Integrator
  • Let's viral #TYPO3v10
  • With the realizing TYPO3 v10 LTS, The TYPO3 Community provides Long Term TYPO3 Support.

As a TYPO3 developer, What’s your favorite feature in TYPO3 v10 or looking for any new feature? Do you have any questions on TYPO3 v10? Just write down in the comment box below and we will be happy to answer you.

Have a Happy TYPO3 v10!

We are publishing a Blog series for TYPO3 v10 for TYPO3 Editors, Integrators, Integrators, and Developers.

Your One-Stop Solutions for Custom TYPO3 Development

  • A Decade of TYPO3 Industry Experience
  • 350+ Successful TYPO3 Projects
  • 87% Repeat TYPO3 Customers
TYPO3 Service

Post a Comment

Captcha Code Can't read the image? Click here to refresh
  • user
    Jacob 2024-01-21 at 6:24 pm
    10 Tell-Tale Signs You Must See To Get A New Accident Injury Attorneys Near Me accident injury attorneys near me
  • user
    Tabitha 2022-09-18 at 2:15 pm
    Последние выпуски передач
    и новые серии любимых сериалов!.
    Здесь смотреть онлайн в хорошем качестве бесплатно фильмы.
    Смотреть онлайн фильм. Смотреть онлайн.
  • user
    Tabitha 2022-09-18 at 2:15 pm
    Последние выпуски передач
    и новые серии любимых сериалов!.
    Здесь смотреть онлайн в хорошем качестве бесплатно фильмы.
    Смотреть онлайн фильм. Смотреть онлайн.
  • user
    Tabitha 2022-09-18 at 2:15 pm
    Последние выпуски передач
    и новые серии любимых сериалов!.
    Здесь смотреть онлайн в хорошем качестве бесплатно фильмы.
    Смотреть онлайн фильм. Смотреть онлайн.
  • user
    Tabitha 2022-09-18 at 2:15 pm
    Последние выпуски передач
    и новые серии любимых сериалов!.
    Здесь смотреть онлайн в хорошем качестве бесплатно фильмы.
    Смотреть онлайн фильм. Смотреть онлайн.
  • user
    Lucas Schmidt 2020-07-06 at 12:16 pm
    This is some serious in-depth look at the TYPO3 version 10! Thank you, Sanjay for such a fantastic and helpful article.
  • user
    Tobias Jones 2020-07-06 at 12:05 pm
    I fell in love with this TYPO3 v 10 newly released update! As usual, TYPO3 is the best in the business.