diff --git a/pkg/enqueue/Symfony/DefaultTransportFactory.php b/pkg/enqueue/Symfony/DefaultTransportFactory.php index 20fa1c91a..e4a7e40b6 100644 --- a/pkg/enqueue/Symfony/DefaultTransportFactory.php +++ b/pkg/enqueue/Symfony/DefaultTransportFactory.php @@ -20,6 +20,7 @@ use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\HttpKernel\Kernel; use function Enqueue\dsn_to_connection_factory; class DefaultTransportFactory implements TransportFactoryInterface, DriverFactoryInterface @@ -141,18 +142,17 @@ public function getName() } /** - * This is a quick fix to the exception "Incompatible use of dynamic environment variables "ENQUEUE_DSN" found in parameters." - * TODO: We'll have to come up with a better solution. - * * @param ContainerBuilder $container - * @param $dsn + * @param string $dsn * * @return array|false|string */ private function resolveDSN(ContainerBuilder $container, $dsn) { if (method_exists($container, 'resolveEnvPlaceholders')) { - $dsn = $container->resolveEnvPlaceholders($dsn); + if (version_compare(Kernel::VERSION, '3.4', '>=')) { + return $container->resolveEnvPlaceholders($dsn, true); + } $matches = []; if (preg_match('/%env\((.*?)\)/', $dsn, $matches)) { diff --git a/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php index 9a013fdb9..ecd6afaa6 100644 --- a/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php @@ -9,6 +9,7 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Processor; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\HttpKernel\Kernel; class DefaultTransportFactoryTest extends TestCase { @@ -266,6 +267,66 @@ public function testShouldCreateDriverFromDsn($dsn, $expectedName) $this->assertEquals($driverId, (string) $context); } + public function testShouldCreateConnectionFactoryFromEnvironmentDSN() + { + if (version_compare(Kernel::VERSION, '3.4', '<')) { + $this->markTestSkipped('This functionality only works on Symfony 3.4 or higher'); + } + + $env = str_replace(['\\', ':'], '', strtoupper(uniqid(__METHOD__))); + putenv("$env=null:"); + + $container = new ContainerBuilder(); + + $transport = new DefaultTransportFactory(); + + $serviceId = $transport->createConnectionFactory($container, ['dsn' => "%env($env)%"]); + + $this->assertEquals('enqueue.transport.default.connection_factory', $serviceId); + + $this->assertTrue($container->hasAlias('enqueue.transport.default.connection_factory')); + $this->assertEquals( + sprintf('enqueue.transport.%s.connection_factory', 'default_null'), + (string) $container->getAlias('enqueue.transport.default.connection_factory') + ); + + $this->assertTrue($container->hasAlias('enqueue.transport.connection_factory')); + $this->assertEquals( + 'enqueue.transport.default.connection_factory', + (string) $container->getAlias('enqueue.transport.connection_factory') + ); + } + + public function testShouldCreateConnectionFactoryFromEnvironmentWithResolveProviderDSN() + { + if (version_compare(Kernel::VERSION, '3.4', '<')) { + $this->markTestSkipped('This functionality only works on Symfony 3.4 or higher'); + } + + $env = str_replace(['\\', ':'], '', strtoupper(uniqid(__METHOD__))); + putenv("$env=file:"); + + $container = new ContainerBuilder(); + + $transport = new DefaultTransportFactory(); + + $serviceId = $transport->createConnectionFactory($container, ['dsn' => "%env(resolve:$env)%"]); + + $this->assertEquals('enqueue.transport.default.connection_factory', $serviceId); + + $this->assertTrue($container->hasAlias('enqueue.transport.default.connection_factory')); + $this->assertEquals( + sprintf('enqueue.transport.%s.connection_factory', 'default_fs'), + (string) $container->getAlias('enqueue.transport.default.connection_factory') + ); + + $this->assertTrue($container->hasAlias('enqueue.transport.connection_factory')); + $this->assertEquals( + 'enqueue.transport.default.connection_factory', + (string) $container->getAlias('enqueue.transport.connection_factory') + ); + } + public static function provideDSNs() { yield ['amqp+ext:', 'default_amqp'];