Skip to content

Commit e3f9e87

Browse files
committed
smfony transport
1 parent 3f00436 commit e3f9e87

File tree

4 files changed

+287
-5
lines changed

4 files changed

+287
-5
lines changed

Client/MongodbDriver.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ class MongodbDriver implements DriverInterface
4242
];
4343

4444
/**
45-
* @param MongodbContext $context
46-
* @param Config $config
45+
* @param MongodbContext $context
46+
* @param Config $config
4747
* @param QueueMetaRegistry $queueMetaRegistry
4848
*/
4949
public function __construct(MongodbContext $context, Config $config, QueueMetaRegistry $queueMetaRegistry)
@@ -161,7 +161,7 @@ public function setupBroker(LoggerInterface $logger = null)
161161
{
162162
$logger = $logger ?: new NullLogger();
163163
$log = function ($text, ...$args) use ($logger) {
164-
$logger->debug(sprintf('[MongodbDriver] ' . $text, ...$args));
164+
$logger->debug(sprintf('[MongodbDriver] '.$text, ...$args));
165165
};
166166
$contextConfig = $this->context->getConfig();
167167
$log('Creating database and collection: "%s" "%s"', $contextConfig['dbname'], $contextConfig['collection_name']);
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
<?php
2+
3+
namespace Enqueue\Mongodb\Symfony;
4+
5+
use Enqueue\Mongodb\Client\MongodbDriver;
6+
use Enqueue\Mongodb\MongodbConnectionFactory;
7+
use Enqueue\Mongodb\MongodbContext;
8+
use Enqueue\Symfony\DriverFactoryInterface;
9+
use Enqueue\Symfony\TransportFactoryInterface;
10+
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
11+
use Symfony\Component\DependencyInjection\ContainerBuilder;
12+
use Symfony\Component\DependencyInjection\Definition;
13+
use Symfony\Component\DependencyInjection\Reference;
14+
15+
class MongodbTransportFactory implements TransportFactoryInterface, DriverFactoryInterface
16+
{
17+
/**
18+
* @var string
19+
*/
20+
private $name;
21+
22+
/**
23+
* @param string $name
24+
*/
25+
public function __construct($name = 'Mongodb')
26+
{
27+
$this->name = $name;
28+
}
29+
30+
/**
31+
* {@inheritdoc}
32+
*/
33+
public function addConfiguration(ArrayNodeDefinition $builder)
34+
{
35+
$builder
36+
->beforeNormalization()
37+
->ifString()
38+
->then(function ($v) {
39+
return ['dsn' => $v];
40+
})
41+
->end()
42+
->children()
43+
->scalarNode('dsn')
44+
->info('The Mongodb DSN. Other parameters are ignored if set')
45+
->end()
46+
->scalarNode('dbname')
47+
->defaultValue('enqueue')
48+
->info('Database name.')
49+
->end()
50+
->scalarNode('collection_name')
51+
->defaultValue('enqueue')
52+
->info('Collection')
53+
->end()
54+
->integerNode('polling_interval')
55+
->defaultValue(1000)
56+
->min(100)
57+
->info('How often query for new messages.')
58+
->end()
59+
;
60+
}
61+
62+
/**
63+
* {@inheritdoc}
64+
*/
65+
public function createConnectionFactory(ContainerBuilder $container, array $config)
66+
{
67+
if (false == empty($config['dsn'])) {
68+
$factory = new Definition(MongodbConnectionFactory::class);
69+
$factory->setArguments([$config]);
70+
} else {
71+
throw new \LogicException('Set "dsn" options when you want ot use Mongodb.');
72+
}
73+
74+
$factoryId = sprintf('enqueue.transport.%s.connection_factory', $this->getName());
75+
$container->setDefinition($factoryId, $factory);
76+
77+
return $factoryId;
78+
}
79+
80+
/**
81+
* {@inheritdoc}
82+
*/
83+
public function createContext(ContainerBuilder $container, array $config)
84+
{
85+
$factoryId = sprintf('enqueue.transport.%s.connection_factory', $this->getName());
86+
87+
$context = new Definition(MongodbContext::class);
88+
$context->setPublic(true);
89+
$context->setFactory([new Reference($factoryId), 'createContext']);
90+
91+
$contextId = sprintf('enqueue.transport.%s.context', $this->getName());
92+
$container->setDefinition($contextId, $context);
93+
94+
return $contextId;
95+
}
96+
97+
/**
98+
* {@inheritdoc}
99+
*/
100+
public function createDriver(ContainerBuilder $container, array $config)
101+
{
102+
$driver = new Definition(MongodbDriver::class);
103+
$driver->setPublic(true);
104+
$driver->setArguments([
105+
new Reference(sprintf('enqueue.transport.%s.context', $this->getName())),
106+
new Reference('enqueue.client.config'),
107+
new Reference('enqueue.client.meta.queue_meta_registry'),
108+
]);
109+
110+
$driverId = sprintf('enqueue.client.%s.driver', $this->getName());
111+
$container->setDefinition($driverId, $driver);
112+
113+
return $driverId;
114+
}
115+
116+
/**
117+
* {@inheritdoc}
118+
*/
119+
public function getName()
120+
{
121+
return $this->name;
122+
}
123+
}

Tests/MongodbConnectionFactoryTest.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ public function testCouldBeConstructedWithEmptyConfiguration()
2020
{
2121
$params = [
2222
'uri' => 'mongodb://127.0.0.1/',
23-
'uriOptions' => [],
24-
'driverOptions' => [],
2523
];
2624

2725
$factory = new MongodbConnectionFactory();
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
<?php
2+
3+
namespace Enqueue\Mongodb\Tests\Symfony;
4+
5+
use Enqueue\Mongodb\Client\MongodbDriver;
6+
use Enqueue\Mongodb\MongodbConnectionFactory;
7+
use Enqueue\Mongodb\Symfony\MongodbTransportFactory;
8+
use Enqueue\Symfony\TransportFactoryInterface;
9+
use Enqueue\Test\ClassExtensionTrait;
10+
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
11+
use Symfony\Component\Config\Definition\Processor;
12+
use Symfony\Component\DependencyInjection\ContainerBuilder;
13+
use Symfony\Component\DependencyInjection\Reference;
14+
15+
class MongodbTransportFactoryTest extends \PHPUnit_Framework_TestCase
16+
{
17+
use ClassExtensionTrait;
18+
19+
public function testShouldImplementTransportFactoryInterface()
20+
{
21+
$this->assertClassImplements(TransportFactoryInterface::class, MongodbTransportFactory::class);
22+
}
23+
24+
public function testCouldBeConstructedWithDefaultName()
25+
{
26+
$transport = new MongodbTransportFactory();
27+
28+
$this->assertEquals('Mongodb', $transport->getName());
29+
}
30+
31+
public function testCouldBeConstructedWithCustomName()
32+
{
33+
$transport = new MongodbTransportFactory('theCustomName');
34+
35+
$this->assertEquals('theCustomName', $transport->getName());
36+
}
37+
38+
public function testShouldAllowAddConfiguration()
39+
{
40+
$transport = new MongodbTransportFactory();
41+
$tb = new TreeBuilder();
42+
$rootNode = $tb->root('foo');
43+
44+
$transport->addConfiguration($rootNode);
45+
$processor = new Processor();
46+
$config = $processor->process($tb->buildTree(), [[
47+
'dsn' => 'mongodb://127.0.0.1/',
48+
]]);
49+
50+
$this->assertEquals([
51+
'dsn' => 'mongodb://127.0.0.1/',
52+
'dbname' => 'enqueue',
53+
'collection_name' => 'enqueue',
54+
'polling_interval' => 1000,
55+
], $config);
56+
}
57+
58+
public function testShouldAllowAddConfigurationAsString()
59+
{
60+
$transport = new MongodbTransportFactory();
61+
$tb = new TreeBuilder();
62+
$rootNode = $tb->root('foo');
63+
64+
$transport->addConfiguration($rootNode);
65+
$processor = new Processor();
66+
$config = $processor->process($tb->buildTree(), ['mysqlDSN']);
67+
68+
$this->assertEquals([
69+
'dsn' => 'mysqlDSN',
70+
'dbname' => 'enqueue',
71+
'collection_name' => 'enqueue',
72+
'polling_interval' => 1000,
73+
], $config);
74+
}
75+
76+
public function testShouldCreateMongodbConnectionFactory()
77+
{
78+
$container = new ContainerBuilder();
79+
80+
$transport = new MongodbTransportFactory();
81+
82+
$serviceId = $transport->createConnectionFactory($container, [
83+
'dsn' => 'mysqlDSN',
84+
'dbname' => 'enqueue',
85+
'collection_name' => 'enqueue',
86+
'polling_interval' => 1000,
87+
]);
88+
89+
$this->assertTrue($container->hasDefinition($serviceId));
90+
$factory = $container->getDefinition($serviceId);
91+
$this->assertEquals(MongodbConnectionFactory::class, $factory->getClass());
92+
93+
$this->assertSame([
94+
'dsn' => 'mysqlDSN',
95+
'dbname' => 'enqueue',
96+
'collection_name' => 'enqueue',
97+
'polling_interval' => 1000,
98+
], $factory->getArgument(0));
99+
}
100+
101+
public function testShouldCreateConnectionFactoryFromDsnString()
102+
{
103+
$container = new ContainerBuilder();
104+
105+
$transport = new MongodbTransportFactory();
106+
107+
$serviceId = $transport->createConnectionFactory($container, [
108+
'dsn' => 'theDSN',
109+
'connection' => [],
110+
'lazy' => true,
111+
'table_name' => 'enqueue',
112+
'polling_interval' => 1000,
113+
]);
114+
115+
$this->assertTrue($container->hasDefinition($serviceId));
116+
$factory = $container->getDefinition($serviceId);
117+
$this->assertEquals(MongodbConnectionFactory::class, $factory->getClass());
118+
$this->assertSame('theDSN', $factory->getArgument(0)['dsn']);
119+
}
120+
121+
public function testShouldCreateContext()
122+
{
123+
$container = new ContainerBuilder();
124+
125+
$transport = new MongodbTransportFactory();
126+
127+
$serviceId = $transport->createContext($container, []);
128+
129+
$this->assertEquals('enqueue.transport.Mongodb.context', $serviceId);
130+
$this->assertTrue($container->hasDefinition($serviceId));
131+
132+
$context = $container->getDefinition('enqueue.transport.Mongodb.context');
133+
$this->assertInstanceOf(Reference::class, $context->getFactory()[0]);
134+
$this->assertEquals('enqueue.transport.Mongodb.connection_factory', (string) $context->getFactory()[0]);
135+
$this->assertEquals('createContext', $context->getFactory()[1]);
136+
}
137+
138+
public function testShouldCreateDriver()
139+
{
140+
$container = new ContainerBuilder();
141+
142+
$transport = new MongodbTransportFactory();
143+
144+
$serviceId = $transport->createDriver($container, []);
145+
146+
$this->assertEquals('enqueue.client.Mongodb.driver', $serviceId);
147+
$this->assertTrue($container->hasDefinition($serviceId));
148+
149+
$driver = $container->getDefinition($serviceId);
150+
$this->assertSame(MongodbDriver::class, $driver->getClass());
151+
152+
$this->assertInstanceOf(Reference::class, $driver->getArgument(0));
153+
$this->assertEquals('enqueue.transport.Mongodb.context', (string) $driver->getArgument(0));
154+
155+
$this->assertInstanceOf(Reference::class, $driver->getArgument(1));
156+
$this->assertEquals('enqueue.client.config', (string) $driver->getArgument(1));
157+
158+
$this->assertInstanceOf(Reference::class, $driver->getArgument(2));
159+
$this->assertEquals('enqueue.client.meta.queue_meta_registry', (string) $driver->getArgument(2));
160+
}
161+
}

0 commit comments

Comments
 (0)