diff --git a/pkg/amqp-ext/Symfony/AmqpTransportFactory.php b/pkg/amqp-ext/Symfony/AmqpTransportFactory.php index c8c5f40fb..f275c7f85 100644 --- a/pkg/amqp-ext/Symfony/AmqpTransportFactory.php +++ b/pkg/amqp-ext/Symfony/AmqpTransportFactory.php @@ -5,13 +5,14 @@ use Enqueue\AmqpExt\AmqpConnectionFactory; use Enqueue\AmqpExt\AmqpContext; use Enqueue\AmqpExt\Client\AmqpDriver; +use Enqueue\Symfony\DriverFactoryInterface; use Enqueue\Symfony\TransportFactoryInterface; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; -class AmqpTransportFactory implements TransportFactoryInterface +class AmqpTransportFactory implements TransportFactoryInterface, DriverFactoryInterface { /** * @var string diff --git a/pkg/dbal/Symfony/DbalTransportFactory.php b/pkg/dbal/Symfony/DbalTransportFactory.php index 28c3ac05e..11e26ccbb 100644 --- a/pkg/dbal/Symfony/DbalTransportFactory.php +++ b/pkg/dbal/Symfony/DbalTransportFactory.php @@ -6,13 +6,14 @@ use Enqueue\Dbal\DbalConnectionFactory; use Enqueue\Dbal\DbalContext; use Enqueue\Dbal\ManagerRegistryConnectionFactory; +use Enqueue\Symfony\DriverFactoryInterface; use Enqueue\Symfony\TransportFactoryInterface; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; -class DbalTransportFactory implements TransportFactoryInterface +class DbalTransportFactory implements TransportFactoryInterface, DriverFactoryInterface { /** * @var string diff --git a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php index 35134ffee..6bd3ce72a 100644 --- a/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php +++ b/pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php @@ -6,6 +6,7 @@ use Enqueue\JobQueue\Job; use Enqueue\Null\Symfony\NullTransportFactory; use Enqueue\Symfony\DefaultTransportFactory; +use Enqueue\Symfony\DriverFactoryInterface; use Enqueue\Symfony\TransportFactoryInterface; use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Resource\FileResource; @@ -68,7 +69,9 @@ public function load(array $configs, ContainerBuilder $container) $loader->load('extensions/exclusive_command_extension.yml'); foreach ($config['transport'] as $name => $transportConfig) { - $this->factories[$name]->createDriver($container, $transportConfig); + if ($this->factories[$name] instanceof DriverFactoryInterface) { + $this->factories[$name]->createDriver($container, $transportConfig); + } } if (isset($config['transport']['default']['alias']) && false == isset($config['transport'][$config['transport']['default']['alias']])) { diff --git a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php index e999fa6ca..b522ccfad 100644 --- a/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php +++ b/pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php @@ -5,6 +5,7 @@ use Enqueue\Bundle\DependencyInjection\Configuration; use Enqueue\Bundle\DependencyInjection\EnqueueExtension; use Enqueue\Bundle\Tests\Unit\Mocks\FooTransportFactory; +use Enqueue\Bundle\Tests\Unit\Mocks\TransportFactoryWithoutDriverFactory; use Enqueue\Client\Producer; use Enqueue\Client\TraceableProducer; use Enqueue\Null\NullContext; @@ -129,7 +130,10 @@ public function testShouldConfigureFooTransport() ], ]], $container); + self::assertTrue($container->hasDefinition('foo.connection_factory')); self::assertTrue($container->hasDefinition('foo.context')); + self::assertFalse($container->hasDefinition('foo.driver')); + $context = $container->getDefinition('foo.context'); self::assertEquals(\stdClass::class, $context->getClass()); self::assertEquals([['foo_param' => 'aParam']], $context->getArguments()); @@ -176,10 +180,31 @@ public function testShouldLoadClientServicesWhenEnabled() ], ]], $container); + self::assertTrue($container->hasDefinition('foo.driver')); self::assertTrue($container->hasDefinition('enqueue.client.config')); self::assertTrue($container->hasDefinition('enqueue.client.producer')); } + public function testShouldNotCreateDriverIfFactoryDoesNotImplementDriverFactoryInterface() + { + $container = new ContainerBuilder(); + + $extension = new EnqueueExtension(); + $extension->addTransportFactory(new TransportFactoryWithoutDriverFactory()); + + $extension->load([[ + 'client' => null, + 'transport' => [ + 'default' => 'without_driver', + 'without_driver' => [], + ], + ]], $container); + + self::assertTrue($container->hasDefinition('without_driver.context')); + self::assertTrue($container->hasDefinition('without_driver.connection_factory')); + self::assertFalse($container->hasDefinition('without_driver.driver')); + } + public function testShouldUseProducerByDefault() { $container = new ContainerBuilder(); diff --git a/pkg/enqueue-bundle/Tests/Unit/Mocks/FooTransportFactory.php b/pkg/enqueue-bundle/Tests/Unit/Mocks/FooTransportFactory.php index 9b61d1c9a..0a83b6eed 100644 --- a/pkg/enqueue-bundle/Tests/Unit/Mocks/FooTransportFactory.php +++ b/pkg/enqueue-bundle/Tests/Unit/Mocks/FooTransportFactory.php @@ -2,12 +2,13 @@ namespace Enqueue\Bundle\Tests\Unit\Mocks; +use Enqueue\Symfony\DriverFactoryInterface; use Enqueue\Symfony\TransportFactoryInterface; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; -class FooTransportFactory implements TransportFactoryInterface +class FooTransportFactory implements TransportFactoryInterface, DriverFactoryInterface { /** * @var string diff --git a/pkg/enqueue-bundle/Tests/Unit/Mocks/TransportFactoryWithoutDriverFactory.php b/pkg/enqueue-bundle/Tests/Unit/Mocks/TransportFactoryWithoutDriverFactory.php new file mode 100644 index 000000000..2f8581207 --- /dev/null +++ b/pkg/enqueue-bundle/Tests/Unit/Mocks/TransportFactoryWithoutDriverFactory.php @@ -0,0 +1,68 @@ +name = $name; + } + + /** + * {@inheritdoc} + */ + public function addConfiguration(ArrayNodeDefinition $builder) + { + } + + /** + * {@inheritdoc} + */ + public function createConnectionFactory(ContainerBuilder $container, array $config) + { + $factoryId = 'without_driver.connection_factory'; + + $container->setDefinition($factoryId, new Definition(\stdClass::class, [$config])); + + return $factoryId; + } + + /** + * {@inheritdoc} + */ + public function createContext(ContainerBuilder $container, array $config) + { + $contextId = 'without_driver.context'; + + $container->setDefinition($contextId, new Definition(\stdClass::class, [$config])); + + return $contextId; + } + + public function createDriver(ContainerBuilder $container, array $config) + { + throw new \LogicException('It should not be called. The method will be removed'); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return $this->name; + } +} diff --git a/pkg/enqueue/Symfony/DefaultTransportFactory.php b/pkg/enqueue/Symfony/DefaultTransportFactory.php index 6e264c4e2..146197098 100644 --- a/pkg/enqueue/Symfony/DefaultTransportFactory.php +++ b/pkg/enqueue/Symfony/DefaultTransportFactory.php @@ -14,7 +14,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use function Enqueue\dsn_to_connection_factory; -class DefaultTransportFactory implements TransportFactoryInterface +class DefaultTransportFactory implements TransportFactoryInterface, DriverFactoryInterface { /** * @var string diff --git a/pkg/enqueue/Symfony/DriverFactoryInterface.php b/pkg/enqueue/Symfony/DriverFactoryInterface.php new file mode 100644 index 000000000..0b1ab027d --- /dev/null +++ b/pkg/enqueue/Symfony/DriverFactoryInterface.php @@ -0,0 +1,21 @@ +