Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
l-vo committed Jan 1, 2022
1 parent 2ac02d3 commit d35d639
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 27 deletions.
6 changes: 3 additions & 3 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,6 @@ private function addDbalSection(ArrayNodeDefinition $node): void
->end()
->children()
->scalarNode('default_connection')->end()
->booleanNode('use_middlewares')
->defaultFalse()
->end()
->end()
->fixXmlConfig('type')
->children()
Expand Down Expand Up @@ -190,6 +187,9 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition
->useAttributeAsKey('name')
->prototype('scalar')->end()
->end()
->booleanNode('use_middlewares')
->defaultFalse()
->end()
->end();

// dbal < 2.11
Expand Down
34 changes: 21 additions & 13 deletions DependencyInjection/DoctrineExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,6 @@ protected function dbalLoad(array $config, ContainerBuilder $container)
foreach ($config['connections'] as $name => $connection) {
$this->loadDbalConnection($name, $connection, $container);
}

$this->useMiddlewaresIfAvailable($config['use_middlewares'], $container);
}

/**
Expand All @@ -160,6 +158,7 @@ protected function loadDbalConnection($name, array $connection, ContainerBuilder
$configuration = $container->setDefinition(sprintf('doctrine.dbal.%s_connection.configuration', $name), new ChildDefinition('doctrine.dbal.connection.configuration'));
$logger = null;
if ($connection['logging']) {
$this->useMiddlewaresIfAvailable($connection, $container, $name, $configuration);
$logger = new Reference('doctrine.dbal.logger');
}

Expand Down Expand Up @@ -1071,19 +1070,28 @@ private function createArrayAdapterCachePool(ContainerBuilder $container, string
return $id;
}

private function useMiddlewaresIfAvailable(bool $useMiddlewares, ContainerBuilder $container): void
/** @param array<string, mixed> $connection */
protected function useMiddlewaresIfAvailable(array $connection, ContainerBuilder $container, string $name, Definition $configuration): void
{
if ($useMiddlewares) {
/** @psalm-suppress UndefinedClass */
if (! interface_exists(Middleware::class)) {
throw new InvalidConfigurationException(sprintf('%s must exist to set use_middlewares to true', Middleware::class));
}
if (! $connection['use_middlewares']) {
return;
}

$container
->getDefinition('doctrine.dbal.logger')
->replaceArgument(0, null);
} else {
$container->removeDefinition('doctrine.dbal.logging_middleware');
/** @psalm-suppress UndefinedClass */
if (! interface_exists(Middleware::class)) {
throw new InvalidConfigurationException(sprintf('%s must exist to set use_middlewares to true', Middleware::class));
}

$container
->getDefinition('doctrine.dbal.logger')
->replaceArgument(0, null);

$loggingMiddlewareDef = $container->setDefinition(
sprintf('doctrine.dbal.%s_connection.logging_middleware', $name),
new ChildDefinition('doctrine.dbal.logging_middleware')
);
$loggingMiddlewareDef->addTag('monolog.logger', ['channel' => 'doctrine']);

$configuration->addMethodCall('setMiddlewares', [[$loggingMiddlewareDef]]);
}
}
3 changes: 1 addition & 2 deletions Resources/config/dbal.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@
<argument type="service" id="debug.stopwatch" on-invalid="null" />
</service>

<service id="doctrine.dbal.logging_middleware" class="Doctrine\DBAL\Logging\Middleware">
<tag name="monolog.logger" channel="doctrine" />
<service id="doctrine.dbal.logging_middleware" class="Doctrine\DBAL\Logging\Middleware" abstract="true">
<argument type="service" id="logger" on-invalid="null" />
</service>

Expand Down
5 changes: 5 additions & 0 deletions Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ public function testDbalLoadSingleMasterSlaveConnection(): void
'dbname' => 'mysql_db',
'host' => 'localhost',
'unix_socket' => '/path/to/mysqld.sock',
'use_middlewares' => false,
],
$param['primary'] ?? $param['master'] // TODO: Remove 'master' support here when we require dbal >= 2.11
);
Expand Down Expand Up @@ -229,6 +230,7 @@ public function testDbalLoadPoolShardingConnection(): void
'dbname' => 'mysql_db',
'host' => 'localhost',
'unix_socket' => '/path/to/mysqld.sock',
'use_middlewares' => false,
],
$param['global']
);
Expand Down Expand Up @@ -283,6 +285,7 @@ public function testLoadSimpleSingleConnection(): void
'driver' => 'pdo_mysql',
'driverOptions' => [],
'defaultTableOptions' => [],
'use_middlewares' => false,
],
new Reference('doctrine.dbal.default_connection.configuration'),
new Reference('doctrine.dbal.default_connection.event_manager'),
Expand Down Expand Up @@ -322,6 +325,7 @@ public function testLoadSimpleSingleConnectionWithoutDbName(): void
'driver' => 'pdo_mysql',
'driverOptions' => [],
'defaultTableOptions' => [],
'use_middlewares' => false,
],
new Reference('doctrine.dbal.default_connection.configuration'),
new Reference('doctrine.dbal.default_connection.event_manager'),
Expand Down Expand Up @@ -362,6 +366,7 @@ public function testLoadSingleConnection(): void
'dbname' => 'sqlite_db',
'memory' => true,
'defaultTableOptions' => [],
'use_middlewares' => false,
],
new Reference('doctrine.dbal.default_connection.configuration'),
new Reference('doctrine.dbal.default_connection.event_manager'),
Expand Down
44 changes: 35 additions & 9 deletions Tests/DependencyInjection/DoctrineExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1152,6 +1152,15 @@ public function testUseMiddlewaresNotActivated(): void
$extension = new DoctrineExtension();

$config = BundleConfigurationBuilder::createBuilderWithBaseValues()
->addConnection([
'connections' => [
'default' => [
'password' => 'foo',
'logging' => true,
],
],
])
->addBaseEntityManager()
->build();

$extension->load([$config], $container);
Expand All @@ -1166,7 +1175,7 @@ public function testUseMiddlewaresNotActivated(): void
$this->assertInstanceOf(Reference::class, $loggerDef->getArgument(0));
$this->assertSame('logger', (string) $loggerDef->getArgument(0));

$this->assertFalse($container->hasDefinition('doctrine.dbal.logging_middleware'));
$this->assertFalse($container->hasDefinition('doctrine.dbal.default_connection.logging_middleware'));
}

public function testUseMiddlewaresActivated(): void
Expand All @@ -1182,28 +1191,42 @@ public function testUseMiddlewaresActivated(): void
$config = BundleConfigurationBuilder::createBuilderWithBaseValues()
->addConnection([
'connections' => [
'default' => ['password' => 'foo'],
'default' => [
'password' => 'foo',
'logging' => true,
'use_middlewares' => true,
],
],
'use_middlewares' => true,
])
->addBaseEntityManager()
->build();

$extension->load([$config], $container);

$loggerDef = $container->getDefinition('doctrine.dbal.logger');

$this->assertNull($loggerDef->getArgument(0));

$loggingMiddlewareDef = $container->getDefinition('doctrine.dbal.logging_middleware');
$loggingMiddlewareDef = $container->getDefinition('doctrine.dbal.default_connection.logging_middleware');
$tags = $loggingMiddlewareDef->getTag('monolog.logger');
$doctrineLoggerTags = array_filter($tags, static function (array $tag): bool {
return ($tag['channel'] ?? null) === 'doctrine';
});
$this->assertCount(1, $doctrineLoggerTags);

$this->assertInstanceOf(Reference::class, $loggingMiddlewareDef->getArgument(0));
$this->assertSame('logger', (string) $loggingMiddlewareDef->getArgument(0));
$this->assertInstanceOf(ChildDefinition::class, $loggingMiddlewareDef);
$parentDef = $container->getDefinition($loggingMiddlewareDef->getParent());
$this->assertInstanceOf(Reference::class, $parentDef->getArgument(0));
$this->assertSame('logger', (string) $parentDef->getArgument(0));

$connectionConfiguration = $container->getDefinition('doctrine.dbal.default_connection.configuration');
$setMiddlewareCalls = array_filter($connectionConfiguration->getMethodCalls(), static function (array $call) {
return $call[0] === 'setMiddlewares';
});
$this->assertCount(1, $setMiddlewareCalls);
$callArgs = $setMiddlewareCalls[0][1];
$this->assertCount(1, $callArgs);
$this->assertCount(1, $callArgs[0]);
$this->assertInstanceOf(Definition::class, $callArgs[0][0]);
}

public function testUseMiddlewaresWithoutMiddlewareInterface(): void
Expand All @@ -1222,9 +1245,12 @@ public function testUseMiddlewaresWithoutMiddlewareInterface(): void
$config = BundleConfigurationBuilder::createBuilderWithBaseValues()
->addConnection([
'connections' => [
'default' => ['password' => 'foo'],
'default' => [
'password' => 'foo',
'logging' => true,
'use_middlewares' => true,
],
],
'use_middlewares' => true,
])
->addBaseEntityManager()
->build();
Expand Down

0 comments on commit d35d639

Please sign in to comment.