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\
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\
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.