Skip to content

Commit 1f81a28

Browse files
authored
use doctrine.middleware tag for registering middlewares (#300)
1 parent e193f5e commit 1f81a28

File tree

5 files changed

+98
-106
lines changed

5 files changed

+98
-106
lines changed

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"require": {
2121
"php": "^7.4 || ^8.0",
2222
"doctrine/dbal": "^3.3 || ^4.0",
23-
"doctrine/doctrine-bundle": "^2.2.2",
23+
"doctrine/doctrine-bundle": "^2.11.0",
2424
"psr/cache": "^1.0 || ^2.0 || ^3.0",
2525
"symfony/cache": "^5.4 || ^6.3 || ^7.0",
2626
"symfony/framework-bundle": "^5.4 || ^6.3 || ^7.0"

src/DAMA/DoctrineTestBundle/DAMADoctrineTestBundle.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
namespace DAMA\DoctrineTestBundle;
44

5-
use DAMA\DoctrineTestBundle\DependencyInjection\DoctrineTestCompilerPass;
5+
use DAMA\DoctrineTestBundle\DependencyInjection\AddMiddlewaresCompilerPass;
6+
use DAMA\DoctrineTestBundle\DependencyInjection\ModifyDoctrineConfigCompilerPass;
67
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
78
use Symfony\Component\DependencyInjection\ContainerBuilder;
89
use Symfony\Component\HttpKernel\Bundle\Bundle;
@@ -13,6 +14,9 @@ public function build(ContainerBuilder $container): void
1314
{
1415
parent::build($container);
1516
// lower priority than CacheCompatibilityPass from DoctrineBundle
16-
$container->addCompilerPass(new DoctrineTestCompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -1);
17+
$container->addCompilerPass(new ModifyDoctrineConfigCompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -1);
18+
19+
// higher priority than MiddlewaresPass from DoctrineBundle
20+
$container->addCompilerPass(new AddMiddlewaresCompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 1);
1721
}
1822
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DAMA\DoctrineTestBundle\DependencyInjection;
6+
7+
use DAMA\DoctrineTestBundle\Doctrine\DBAL\Middleware;
8+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
9+
use Symfony\Component\DependencyInjection\ContainerBuilder;
10+
11+
final class AddMiddlewaresCompilerPass implements CompilerPassInterface
12+
{
13+
public const TRANSACTIONAL_BEHAVIOR_ENABLED_CONNECTIONS = 'dama.doctrine_test.transactional_behavior_enabled_connections';
14+
15+
public function process(ContainerBuilder $container): void
16+
{
17+
/** @var array<string, mixed> $connections */
18+
$connections = $container->getParameter('doctrine.connections');
19+
$connectionNames = array_keys($connections);
20+
$transactionalBehaviorEnabledConnections = $this->getTransactionEnabledConnectionNames($container, $connectionNames);
21+
$container->getParameterBag()->set(self::TRANSACTIONAL_BEHAVIOR_ENABLED_CONNECTIONS, $transactionalBehaviorEnabledConnections);
22+
23+
foreach ($transactionalBehaviorEnabledConnections as $name) {
24+
$middlewareDefinition = $container->register(sprintf('dama.doctrine.dbal.middleware.%s', $name), Middleware::class);
25+
$middlewareDefinition->addTag('doctrine.middleware', ['connection' => $name, 'priority' => 100]);
26+
}
27+
28+
$container->getParameterBag()->remove('dama.'.Configuration::ENABLE_STATIC_CONNECTION);
29+
}
30+
31+
/**
32+
* @param string[] $connectionNames
33+
*
34+
* @return string[]
35+
*/
36+
private function getTransactionEnabledConnectionNames(ContainerBuilder $container, array $connectionNames): array
37+
{
38+
/** @var bool|array<string, bool> $enableStaticConnectionsConfig */
39+
$enableStaticConnectionsConfig = $container->getParameter('dama.'.Configuration::ENABLE_STATIC_CONNECTION);
40+
41+
if (is_array($enableStaticConnectionsConfig)) {
42+
$this->validateConnectionNames(array_keys($enableStaticConnectionsConfig), $connectionNames);
43+
}
44+
45+
$enabledConnections = [];
46+
47+
foreach ($connectionNames as $name) {
48+
if ($enableStaticConnectionsConfig === true
49+
|| isset($enableStaticConnectionsConfig[$name]) && $enableStaticConnectionsConfig[$name] === true
50+
) {
51+
$enabledConnections[] = $name;
52+
}
53+
}
54+
55+
return $enabledConnections;
56+
}
57+
58+
/**
59+
* @param string[] $configNames
60+
* @param string[] $existingNames
61+
*/
62+
private function validateConnectionNames(array $configNames, array $existingNames): void
63+
{
64+
$unknown = array_diff($configNames, $existingNames);
65+
66+
if (count($unknown)) {
67+
throw new \InvalidArgumentException(sprintf('Unknown doctrine dbal connection name(s): %s.', implode(', ', $unknown)));
68+
}
69+
}
70+
}

src/DAMA/DoctrineTestBundle/DependencyInjection/DoctrineTestCompilerPass.php src/DAMA/DoctrineTestBundle/DependencyInjection/ModifyDoctrineConfigCompilerPass.php

+7-51
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,18 @@
33
namespace DAMA\DoctrineTestBundle\DependencyInjection;
44

55
use DAMA\DoctrineTestBundle\Doctrine\Cache\Psr6StaticArrayCache;
6-
use DAMA\DoctrineTestBundle\Doctrine\DBAL\Middleware;
76
use Doctrine\Common\Cache\Cache;
87
use Doctrine\DBAL\Connection;
98
use Psr\Cache\CacheItemPoolInterface;
109
use Symfony\Component\DependencyInjection\ChildDefinition;
1110
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1211
use Symfony\Component\DependencyInjection\ContainerBuilder;
1312
use Symfony\Component\DependencyInjection\Definition;
14-
use Symfony\Component\DependencyInjection\Reference;
1513

16-
class DoctrineTestCompilerPass implements CompilerPassInterface
14+
final class ModifyDoctrineConfigCompilerPass implements CompilerPassInterface
1715
{
1816
public function process(ContainerBuilder $container): void
1917
{
20-
$container->register('dama.doctrine.dbal.middleware', Middleware::class);
2118
$cacheNames = [];
2219

2320
if ($container->getParameter('dama.'.Configuration::STATIC_META_CACHE)) {
@@ -31,7 +28,11 @@ public function process(ContainerBuilder $container): void
3128
/** @var array<string, mixed> $connections */
3229
$connections = $container->getParameter('doctrine.connections');
3330
$connectionNames = array_keys($connections);
34-
$transactionalBehaviorEnabledConnections = $this->getTransactionEnabledConnectionNames($container, $connectionNames);
31+
32+
/** @var string[] $transactionalBehaviorEnabledConnections */
33+
$transactionalBehaviorEnabledConnections = $container->getParameter(
34+
AddMiddlewaresCompilerPass::TRANSACTIONAL_BEHAVIOR_ENABLED_CONNECTIONS,
35+
);
3536
$connectionKeys = $this->getConnectionKeys($container, $connectionNames);
3637

3738
foreach ($connectionNames as $name) {
@@ -56,10 +57,10 @@ public function process(ContainerBuilder $container): void
5657
}
5758
}
5859

59-
$container->getParameterBag()->remove('dama.'.Configuration::ENABLE_STATIC_CONNECTION);
6060
$container->getParameterBag()->remove('dama.'.Configuration::STATIC_META_CACHE);
6161
$container->getParameterBag()->remove('dama.'.Configuration::STATIC_QUERY_CACHE);
6262
$container->getParameterBag()->remove('dama.'.Configuration::CONNECTION_KEYS);
63+
$container->getParameterBag()->remove(AddMiddlewaresCompilerPass::TRANSACTIONAL_BEHAVIOR_ENABLED_CONNECTIONS);
6364
}
6465

6566
/**
@@ -79,24 +80,6 @@ private function modifyConnectionService(ContainerBuilder $container, $connectio
7980
0,
8081
$this->getModifiedConnectionOptions($connectionOptions, $connectionKey, $name),
8182
);
82-
83-
$connectionConfig = $container->getDefinition(sprintf('doctrine.dbal.%s_connection.configuration', $name));
84-
$methodCalls = $connectionConfig->getMethodCalls();
85-
$middlewareRef = new Reference('dama.doctrine.dbal.middleware');
86-
$hasMiddlewaresMethodCall = false;
87-
foreach ($methodCalls as &$methodCall) {
88-
if ($methodCall[0] === 'setMiddlewares') {
89-
$hasMiddlewaresMethodCall = true;
90-
// our middleware needs to be the first one here so we wrap the "native" driver
91-
$methodCall[1][0] = array_merge([$middlewareRef], $methodCall[1][0]);
92-
}
93-
}
94-
95-
if (!$hasMiddlewaresMethodCall) {
96-
$methodCalls[] = ['setMiddlewares', [[$middlewareRef]]];
97-
}
98-
99-
$connectionConfig->setMethodCalls($methodCalls);
10083
}
10184

10285
/**
@@ -166,33 +149,6 @@ private function registerStaticCache(
166149
$container->setDefinition($cacheServiceId, $cache);
167150
}
168151

169-
/**
170-
* @param string[] $connectionNames
171-
*
172-
* @return string[]
173-
*/
174-
private function getTransactionEnabledConnectionNames(ContainerBuilder $container, array $connectionNames): array
175-
{
176-
/** @var bool|array<string, bool> $enableStaticConnectionsConfig */
177-
$enableStaticConnectionsConfig = $container->getParameter('dama.'.Configuration::ENABLE_STATIC_CONNECTION);
178-
179-
if (is_array($enableStaticConnectionsConfig)) {
180-
$this->validateConnectionNames(array_keys($enableStaticConnectionsConfig), $connectionNames);
181-
}
182-
183-
$enabledConnections = [];
184-
185-
foreach ($connectionNames as $name) {
186-
if ($enableStaticConnectionsConfig === true
187-
|| isset($enableStaticConnectionsConfig[$name]) && $enableStaticConnectionsConfig[$name] === true
188-
) {
189-
$enabledConnections[] = $name;
190-
}
191-
}
192-
193-
return $enabledConnections;
194-
}
195-
196152
/**
197153
* @param string[] $configNames
198154
* @param string[] $existingNames

tests/DAMA/DoctrineTestBundle/DependencyInjection/DoctrineTestCompilerPassTest.php tests/DAMA/DoctrineTestBundle/DependencyInjection/CompilerPassesTest.php

+14-52
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<?php
22

3+
declare(strict_types=1);
4+
35
namespace Tests\DAMA\DoctrineTestBundle\DependencyInjection;
46

7+
use DAMA\DoctrineTestBundle\DependencyInjection\AddMiddlewaresCompilerPass;
58
use DAMA\DoctrineTestBundle\DependencyInjection\DAMADoctrineTestExtension;
6-
use DAMA\DoctrineTestBundle\DependencyInjection\DoctrineTestCompilerPass;
9+
use DAMA\DoctrineTestBundle\DependencyInjection\ModifyDoctrineConfigCompilerPass;
710
use DAMA\DoctrineTestBundle\Doctrine\Cache\Psr6StaticArrayCache;
811
use Doctrine\Bundle\DoctrineBundle\ConnectionFactory;
912
use Doctrine\DBAL\Configuration;
@@ -13,9 +16,8 @@
1316
use Symfony\Component\DependencyInjection\ChildDefinition;
1417
use Symfony\Component\DependencyInjection\ContainerBuilder;
1518
use Symfony\Component\DependencyInjection\Definition;
16-
use Symfony\Component\DependencyInjection\Reference;
1719

18-
class DoctrineTestCompilerPassTest extends TestCase
20+
class CompilerPassesTest extends TestCase
1921
{
2022
private const CACHE_SERVICE_IDS = [
2123
'doctrine.orm.a_metadata_cache',
@@ -55,11 +57,6 @@ public function testProcess(array $config, callable $assertCallback, ?callable $
5557
;
5658
}
5759

58-
$containerBuilder->setDefinition(
59-
'doctrine.dbal.a_connection.configuration',
60-
(new Definition(Configuration::class))
61-
->setMethodCalls([['setMiddlewares', [[new Reference('foo')]]]])
62-
);
6360
$containerBuilder->setDefinition('doctrine.dbal.b_connection.configuration', new Definition(Configuration::class));
6461
$containerBuilder->setDefinition('doctrine.dbal.c_connection.configuration', new Definition(Configuration::class));
6562

@@ -69,7 +66,8 @@ public function testProcess(array $config, callable $assertCallback, ?callable $
6966
$expectationCallback($this, $containerBuilder);
7067
}
7168

72-
(new DoctrineTestCompilerPass())->process($containerBuilder);
69+
(new AddMiddlewaresCompilerPass())->process($containerBuilder);
70+
(new ModifyDoctrineConfigCompilerPass())->process($containerBuilder);
7371

7472
foreach (array_keys($containerBuilder->getParameterBag()->all()) as $parameterName) {
7573
$this->assertStringStartsNotWith('dama.', $parameterName);
@@ -97,35 +95,6 @@ function (ContainerBuilder $containerBuilder): void {
9795
self::assertSame([
9896
'dama.connection_key' => 'a',
9997
], $containerBuilder->getDefinition('doctrine.dbal.a_connection')->getArgument(0));
100-
101-
self::assertEquals(
102-
[
103-
[
104-
'setMiddlewares',
105-
[
106-
[
107-
new Reference('dama.doctrine.dbal.middleware'),
108-
new Reference('foo'),
109-
],
110-
],
111-
],
112-
],
113-
$containerBuilder->getDefinition('doctrine.dbal.a_connection.configuration')->getMethodCalls()
114-
);
115-
116-
self::assertEquals(
117-
[
118-
[
119-
'setMiddlewares',
120-
[
121-
[
122-
new Reference('dama.doctrine.dbal.middleware'),
123-
],
124-
],
125-
],
126-
],
127-
$containerBuilder->getDefinition('doctrine.dbal.b_connection.configuration')->getMethodCalls()
128-
);
12998
},
13099
];
131100

@@ -137,20 +106,6 @@ function (ContainerBuilder $containerBuilder): void {
137106
],
138107
function (ContainerBuilder $containerBuilder): void {
139108
self::assertFalse($containerBuilder->hasDefinition('doctrine.orm.a_metadata_cache'));
140-
141-
self::assertEquals(
142-
[
143-
[
144-
'setMiddlewares',
145-
[
146-
[
147-
new Reference('foo'),
148-
],
149-
],
150-
],
151-
],
152-
$containerBuilder->getDefinition('doctrine.dbal.a_connection.configuration')->getMethodCalls()
153-
);
154109
},
155110
];
156111

@@ -167,8 +122,14 @@ function (ContainerBuilder $containerBuilder): void {
167122
self::assertSame([
168123
'dama.connection_key' => 'a',
169124
], $containerBuilder->getDefinition('doctrine.dbal.a_connection')->getArgument(0));
125+
self::assertTrue($containerBuilder->hasDefinition('dama.doctrine.dbal.middleware.a'));
126+
self::assertSame([
127+
'connection' => 'a',
128+
'priority' => 100,
129+
], $containerBuilder->getDefinition('dama.doctrine.dbal.middleware.a')->getTag('doctrine.middleware')[0]);
170130

171131
self::assertSame([], $containerBuilder->getDefinition('doctrine.dbal.b_connection')->getArgument(0));
132+
self::assertFalse($containerBuilder->hasDefinition('dama.doctrine.dbal.middleware.b'));
172133

173134
self::assertSame(
174135
[
@@ -187,6 +148,7 @@ function (ContainerBuilder $containerBuilder): void {
187148
],
188149
$containerBuilder->getDefinition('doctrine.dbal.c_connection')->getArgument(0)
189150
);
151+
self::assertTrue($containerBuilder->hasDefinition('dama.doctrine.dbal.middleware.c'));
190152
},
191153
];
192154

0 commit comments

Comments
 (0)