37
37
use Symfony \Bridge \Doctrine \DependencyInjection \AbstractDoctrineExtension ;
38
38
use Symfony \Bridge \Doctrine \IdGenerator \UlidGenerator ;
39
39
use Symfony \Bridge \Doctrine \IdGenerator \UuidGenerator ;
40
+ use Symfony \Bridge \Doctrine \Middleware \IdleConnection \Listener ;
40
41
use Symfony \Bridge \Doctrine \PropertyInfo \DoctrineExtractor ;
41
42
use Symfony \Bridge \Doctrine \SchemaListener \DoctrineDbalCacheAdapterSchemaListener ;
42
43
use Symfony \Bridge \Doctrine \SchemaListener \LockStoreSchemaListener ;
83
84
*
84
85
* @final since 2.9
85
86
* @psalm-type DBALConfig = array{
86
- * connections: array<string, array{logging: bool, profiling: bool, profiling_collect_backtrace: bool}>,
87
+ * connections: array<string, array{logging: bool, profiling: bool, profiling_collect_backtrace: bool, idle_connection_ttl: int }>,
87
88
* driver_schemes: array<string, string>,
88
89
* default_connection: string,
89
90
* types: array<string, string>,
@@ -174,12 +175,6 @@ protected function dbalLoad(array $config, ContainerBuilder $container)
174
175
$ config ['default_connection ' ] = reset ($ keys );
175
176
}
176
177
177
- if (! $ container ->hasParameter ('kernel.runtime_mode ' ) && ! $ container ->hasParameter ('kernel.runtime_mode.worker ' )) {
178
- $ container ->removeDefinition ('doctrine.listeners.doctrine_connection_listener ' );
179
- } else {
180
- $ container ->getDefinition ('doctrine.orm.listeners.doctrine_connection_listener ' )->setArgument (1 , $ config ['check_connection_timing ' ]);
181
- }
182
-
183
178
$ this ->defaultConnection = $ config ['default_connection ' ];
184
179
185
180
$ container ->setAlias ('database_connection ' , sprintf ('doctrine.dbal.%s_connection ' , $ this ->defaultConnection ));
@@ -202,13 +197,8 @@ protected function dbalLoad(array $config, ContainerBuilder $container)
202
197
$ connWithLogging = [];
203
198
$ connWithProfiling = [];
204
199
$ connWithBacktrace = [];
205
- $ timingByConnection = [];
206
- $ skipTiming = false ;
207
-
208
- if (! $ container ->hasParameter ('kernel.runtime_mode ' ) && ! $ container ->hasParameter ('kernel.runtime_mode.worker ' )) {
209
- $ container ->removeDefinition ('doctrine.listeners.doctrine_connection_listener ' );
210
- $ skipTiming = true ;
211
- }
200
+ $ ttlByConnection = [];
201
+ $ connWithTtl = [];
212
202
213
203
foreach ($ config ['connections ' ] as $ name => $ connection ) {
214
204
if ($ connection ['logging ' ]) {
@@ -223,17 +213,14 @@ protected function dbalLoad(array $config, ContainerBuilder $container)
223
213
}
224
214
}
225
215
226
- if (! $ skipTiming ) {
227
- $ timingByConnection [] = ['name ' => $ connections [$ name ], 'timing ' => $ connection ['check_connection_timing ' ]];
216
+ if ($ connection ['idle_connection_ttl ' ] > 0 ) {
217
+ $ connWithTtl [] = $ name ;
218
+ $ ttlByConnection [$ name ] = $ connection ['idle_connection_ttl ' ];
228
219
}
229
220
230
221
$ this ->loadDbalConnection ($ name , $ connection , $ container );
231
222
}
232
223
233
- if (! $ skipTiming ) {
234
- $ container ->getDefinition ('doctrine.orm.listeners.doctrine_connection_listener ' )->setArgument (1 , $ timingByConnection );
235
- }
236
-
237
224
$ container ->registerForAutoconfiguration (MiddlewareInterface::class)->addTag ('doctrine.middleware ' );
238
225
239
226
$ container ->registerAttributeForAutoconfiguration (AsMiddleware::class, static function (ChildDefinition $ definition , AsMiddleware $ attribute ) {
@@ -250,7 +237,16 @@ protected function dbalLoad(array $config, ContainerBuilder $container)
250
237
}
251
238
});
252
239
253
- $ this ->registerDbalMiddlewares ($ container , $ connWithLogging , $ connWithProfiling , $ connWithBacktrace );
240
+ $ this ->registerDbalMiddlewares ($ container , $ connWithLogging , $ connWithProfiling , $ connWithBacktrace , $ connWithTtl );
241
+
242
+ $ container ->getDefinition ('doctrine.dbal.idle_connection_middleware ' )->setArgument (1 , $ ttlByConnection );
243
+
244
+ if (class_exists (Listener::class)) {
245
+ return ;
246
+ }
247
+
248
+ $ container ->removeDefinition ('doctrine.dbal.idle_connection_listener ' );
249
+ $ container ->removeDefinition ('doctrine.dbal.idle_connection_middleware ' );
254
250
}
255
251
256
252
/**
@@ -1196,12 +1192,14 @@ private function createArrayAdapterCachePool(ContainerBuilder $container, string
1196
1192
* @param string[] $connWithLogging
1197
1193
* @param string[] $connWithProfiling
1198
1194
* @param string[] $connWithBacktrace
1195
+ * @param string[] $connWithTtl
1199
1196
*/
1200
1197
private function registerDbalMiddlewares (
1201
1198
ContainerBuilder $ container ,
1202
1199
array $ connWithLogging ,
1203
1200
array $ connWithProfiling ,
1204
- array $ connWithBacktrace
1201
+ array $ connWithBacktrace ,
1202
+ array $ connWithTtl
1205
1203
): void {
1206
1204
$ loader = new XmlFileLoader ($ container , new FileLocator (__DIR__ . '/../Resources/config ' ));
1207
1205
$ loader ->load ('middlewares.xml ' );
@@ -1217,5 +1215,11 @@ private function registerDbalMiddlewares(
1217
1215
$ debugMiddlewareAbstractDef
1218
1216
->addTag ('doctrine.middleware ' , ['connection ' => $ connName ]);
1219
1217
}
1218
+
1219
+ $ idleConnectionMiddlewareAbstractDef = $ container ->getDefinition ('doctrine.dbal.idle_connection_middleware ' );
1220
+ foreach ($ connWithTtl as $ connName ) {
1221
+ $ idleConnectionMiddlewareAbstractDef
1222
+ ->addTag ('doctrine.middleware ' , ['connection ' => $ connName , 'priority ' => 10 ]);
1223
+ }
1220
1224
}
1221
1225
}
0 commit comments