Feature: #102496 - Introduce global Doctrine DBAL driver middlewares

See forge#102496

Description

Since v3, Doctrine DBAL supports adding custom driver middlewares. These middlewares act as a decorator around the actual Driver component. Subsequently, the Connection, Statement and Result components can be decorated as well. These middlewares must implement the \Doctrine\DBAL\Driver\Middleware interface. A common use case would be a middleware for implementing SQL logging capabilities.

For more information on driver middlewares, see https://www.doctrine-project.org/projects/doctrine-dbal/en/current/reference/architecture.html. Furthermore, you can look up the implementation of the \TYPO3\CMS\Adminpanel\Log\DoctrineSqlLoggingMiddleware in ext:adminpanel as an example.

With Feature: #100089 - Introduce Doctrine DBAL v3 driver middlewares this has been introduced as a configuration per connection.

Now it's also possible to register global driver middlewares once, which are applied to all configured connections and then the specific connection middlewares.

See sortable Doctrine DBAL middleware registration feature changelog for further details about the middleware configuration block.

Warning

Do not remove or disable provided global Core driver middlewares which are essential.

Registering a new global driver middleware

use MyVendor\MyExt\Doctrine\Driver\CustomGlobalDriverMiddleware;

// Register a global middleware
$GLOBALS['TYPO3_CONF_VARS']['DB']['globalDriverMiddlewares']['my-ext/custom-global-driver-middleware'] = [
  'target' => CustomGlobalDriverMiddleware::class,
  'after' [
    // NOTE: Custom driver middleware should be registered after essential
    //       TYPO3 Core driver middlewares. Use the following identifiers
    //       to ensure that.
    'typo3/core/custom-platform-driver-middleware',
    'typo3/core/custom-pdo-driver-result-middleware',
  ],
];

Disable a global middleware for a specific connection

use MyVendor\MyExt\Doctrine\Driver\CustomGlobalDriverMiddleware;

// Register a global middleware
$GLOBALS['TYPO3_CONF_VARS']['DB']['globalDriverMiddlewares']['my-ext/custom-global-driver-middleware'] = [
  'target' => CustomGlobalDriverMiddleware::class,
  'after' [
    // NOTE: Custom driver middleware should be registered after essential
    //       TYPO3 Core driver middlewares. Use the following identifiers
    //       to ensure that.
    'typo3/core/custom-platform-driver-middleware',
    'typo3/core/custom-pdo-driver-result-middleware',
  ],
];

// Disable a global driver middleware for a specific connection
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['SecondDatabase']['driverMiddlewares']['my-ext/custom-global-driver-middleware']['disabled'] = true;

Impact

Using custom global middlewares allows to enhance the functionality of Doctrine components for all connections.