From e9c5625c088b935c3c77a07258adc2831a055367 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Fri, 2 Mar 2018 16:56:14 +0200 Subject: [PATCH 1/3] [bundle] add support for %env(resolve:FOO)% feature. --- .../Symfony/DefaultTransportFactory.php | 16 +----- .../Symfony/DefaultTransportFactoryTest.php | 52 +++++++++++++++++++ 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/pkg/enqueue/Symfony/DefaultTransportFactory.php b/pkg/enqueue/Symfony/DefaultTransportFactory.php index 20fa1c91a..e2fb8e485 100644 --- a/pkg/enqueue/Symfony/DefaultTransportFactory.php +++ b/pkg/enqueue/Symfony/DefaultTransportFactory.php @@ -141,27 +141,15 @@ 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); - - $matches = []; - if (preg_match('/%env\((.*?)\)/', $dsn, $matches)) { - if (false === $realDsn = getenv($matches[1])) { - throw new \LogicException(sprintf('The env "%s" var is not defined', $matches[1])); - } - - return $realDsn; - } + return $container->resolveEnvPlaceholders($dsn, true); } return $dsn; diff --git a/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php index 9a013fdb9..6a35698c0 100644 --- a/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php +++ b/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php @@ -266,6 +266,58 @@ public function testShouldCreateDriverFromDsn($dsn, $expectedName) $this->assertEquals($driverId, (string) $context); } + public function testShouldCreateConnectionFactoryFromEnvironmentDSN() + { + $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() + { + $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']; From 7ea7d95199ab8a0f8f5094c67392f1cda67366e1 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 3 Mar 2018 09:26:11 +0200 Subject: [PATCH 2/3] run env tests for Symfony 3.4+ only --- .../Tests/Symfony/DefaultTransportFactoryTest.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php b/pkg/enqueue/Tests/Symfony/DefaultTransportFactoryTest.php index 6a35698c0..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 { @@ -268,6 +269,10 @@ public function testShouldCreateDriverFromDsn($dsn, $expectedName) 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:"); @@ -294,6 +299,10 @@ public function testShouldCreateConnectionFactoryFromEnvironmentDSN() 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:"); From 117a7d063056d2fd2a44e435b8b64e2f86382553 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sat, 3 Mar 2018 19:41:17 +0200 Subject: [PATCH 3/3] use old approach for symfony 3.2,3.3 --- pkg/enqueue/Symfony/DefaultTransportFactory.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/pkg/enqueue/Symfony/DefaultTransportFactory.php b/pkg/enqueue/Symfony/DefaultTransportFactory.php index e2fb8e485..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 @@ -149,7 +150,18 @@ public function getName() private function resolveDSN(ContainerBuilder $container, $dsn) { if (method_exists($container, 'resolveEnvPlaceholders')) { - return $container->resolveEnvPlaceholders($dsn, true); + if (version_compare(Kernel::VERSION, '3.4', '>=')) { + return $container->resolveEnvPlaceholders($dsn, true); + } + + $matches = []; + if (preg_match('/%env\((.*?)\)/', $dsn, $matches)) { + if (false === $realDsn = getenv($matches[1])) { + throw new \LogicException(sprintf('The env "%s" var is not defined', $matches[1])); + } + + return $realDsn; + } } return $dsn;