diff --git a/composer.json b/composer.json index 4af78805..58c35297 100644 --- a/composer.json +++ b/composer.json @@ -42,7 +42,7 @@ }, "require-dev": { "doctrine/dbal": "^2.13||^3.0", - "doctrine/doctrine-bundle": "^1.12||^2.5", + "doctrine/doctrine-bundle": "^2.6", "friendsofphp/php-cs-fixer": "^2.19||^3.40", "masterminds/html5": "^2.8", "phpstan/extension-installer": "^1.0", diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index d90f7ff1..4b631601 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1,10 +1,5 @@ parameters: ignoreErrors: - - - message: "#^Parameter \\#1 \\.\\.\\.\\$arrays of function array_merge expects array, mixed given\\.$#" - count: 1 - path: src/DependencyInjection/Compiler/DbalTracingPass.php - - message: "#^Call to an undefined method Symfony\\\\Component\\\\Config\\\\Definition\\\\Builder\\\\TreeBuilder\\:\\:root\\(\\)\\.$#" count: 1 diff --git a/src/DependencyInjection/Compiler/DbalTracingPass.php b/src/DependencyInjection/Compiler/DbalTracingPass.php index d1e4d37f..e867a781 100644 --- a/src/DependencyInjection/Compiler/DbalTracingPass.php +++ b/src/DependencyInjection/Compiler/DbalTracingPass.php @@ -9,7 +9,6 @@ use Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; final class DbalTracingPass implements CompilerPassInterface @@ -20,12 +19,6 @@ final class DbalTracingPass implements CompilerPassInterface */ private const CONNECTION_SERVICE_NAME_FORMAT = 'doctrine.dbal.%s_connection'; - /** - * This is the format used by the DoctrineBundle bundle to register the - * services for each connection's configuration. - */ - private const CONNECTION_CONFIG_SERVICE_NAME_FORMAT = 'doctrine.dbal.%s_connection.configuration'; - /** * {@inheritdoc} */ @@ -66,13 +59,8 @@ public function process(ContainerBuilder $container): void private function configureConnectionForDoctrineDBALVersion3(ContainerBuilder $container, string $connectionName): void { - $configurationDefinition = $container->getDefinition(sprintf(self::CONNECTION_CONFIG_SERVICE_NAME_FORMAT, $connectionName)); - $setMiddlewaresMethodCallArguments = $this->getSetMiddlewaresMethodCallArguments($configurationDefinition); - $setMiddlewaresMethodCallArguments[0] = array_merge($setMiddlewaresMethodCallArguments[0] ?? [], [new Reference(TracingDriverMiddleware::class)]); - - $configurationDefinition - ->removeMethodCall('setMiddlewares') - ->addMethodCall('setMiddlewares', $setMiddlewaresMethodCallArguments); + $tracingMiddlewareDefinition = $container->getDefinition(TracingDriverMiddleware::class); + $tracingMiddlewareDefinition->addTag('doctrine.middleware', ['connection' => $connectionName]); } private function configureConnectionForDoctrineDBALVersion2(ContainerBuilder $container, string $connectionName): void @@ -81,20 +69,6 @@ private function configureConnectionForDoctrineDBALVersion2(ContainerBuilder $co $connectionDefinition->setConfigurator([new Reference(ConnectionConfigurator::class), 'configure']); } - /** - * @return mixed[] - */ - private function getSetMiddlewaresMethodCallArguments(Definition $definition): array - { - foreach ($definition->getMethodCalls() as $methodCall) { - if ('setMiddlewares' === $methodCall[0]) { - return $methodCall[1]; - } - } - - return []; - } - private function assertRequiredDbalVersion(): void { if (interface_exists(Result::class)) { diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml index ed762306..74682cc6 100644 --- a/src/Resources/config/services.xml +++ b/src/Resources/config/services.xml @@ -106,6 +106,7 @@ + diff --git a/src/SentryBundle.php b/src/SentryBundle.php index aacd5126..ed813dea 100644 --- a/src/SentryBundle.php +++ b/src/SentryBundle.php @@ -8,6 +8,7 @@ use Sentry\SentryBundle\DependencyInjection\Compiler\CacheTracingPass; use Sentry\SentryBundle\DependencyInjection\Compiler\DbalTracingPass; use Sentry\SentryBundle\DependencyInjection\Compiler\HttpClientTracingPass; +use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; @@ -21,7 +22,7 @@ public function build(ContainerBuilder $container): void { parent::build($container); - $container->addCompilerPass(new DbalTracingPass()); + $container->addCompilerPass(new DbalTracingPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 10); $container->addCompilerPass(new CacheTracingPass()); $container->addCompilerPass(new HttpClientTracingPass()); $container->addCompilerPass(new AddLoginListenerTagPass()); diff --git a/tests/DependencyInjection/Compiler/DbalTracingPassTest.php b/tests/DependencyInjection/Compiler/DbalTracingPassTest.php index 93a6b5d7..dc850b20 100644 --- a/tests/DependencyInjection/Compiler/DbalTracingPassTest.php +++ b/tests/DependencyInjection/Compiler/DbalTracingPassTest.php @@ -23,62 +23,15 @@ public function testProcessWithDoctrineDBALVersionAtLeast30(): void } $container = $this->createContainerBuilder(); - $container->setParameter('sentry.tracing.dbal.connections', ['foo', 'bar', 'baz']); - - $container - ->register('foo.service', \stdClass::class) - ->setPublic(true); - - $container - ->register('doctrine.dbal.foo_connection.configuration', Configuration::class) - ->setPublic(true); - - $container - ->register('doctrine.dbal.bar_connection.configuration', Configuration::class) - ->addMethodCall('setMiddlewares', [[]]) - ->setPublic(true); - - $container - ->register('doctrine.dbal.baz_connection.configuration', Configuration::class) - ->addMethodCall('setMiddlewares', [[new Reference('foo.service')]]) - ->setPublic(true); - + $container->setParameter('sentry.tracing.dbal.connections', ['foo', 'bar']); $container->compile(); - $this->assertEquals( - [ - [ - 'setMiddlewares', - [[new Reference(TracingDriverMiddleware::class)]], - ], - ], - $container->getDefinition('doctrine.dbal.foo_connection.configuration')->getMethodCalls() - ); - - $this->assertEquals( - [ - [ - 'setMiddlewares', - [[new Reference(TracingDriverMiddleware::class)]], - ], - ], - $container->getDefinition('doctrine.dbal.bar_connection.configuration')->getMethodCalls() - ); - - $this->assertEquals( - [ - [ - 'setMiddlewares', - [ - [ - new Reference('foo.service'), - new Reference(TracingDriverMiddleware::class), - ], - ], - ], - ], - $container->getDefinition('doctrine.dbal.baz_connection.configuration')->getMethodCalls() - ); + $tracingMiddlewareDefinition = $container->getDefinition(TracingDriverMiddleware::class); + $doctrineMiddlewareTags = $tracingMiddlewareDefinition->getTag('doctrine.middleware'); + + $this->assertCount(2, $doctrineMiddlewareTags); + $this->assertSame(['connection' => 'foo'], $doctrineMiddlewareTags[0]); + $this->assertSame(['connection' => 'bar'], $doctrineMiddlewareTags[1]); } public function testProcessWithDoctrineDBALVersionLowerThan30(): void