Skip to content

Commit f2124c4

Browse files
committed
Merge pull request #233 from bburnichon/feature/di-connection-factory
Add AMQPConnectionFactory services.
2 parents bb2701d + ce9441a commit f2124c4

File tree

6 files changed

+266
-44
lines changed

6 files changed

+266
-44
lines changed

DependencyInjection/OldSoundRabbitMqExtension.php

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -74,24 +74,16 @@ protected function loadConnections()
7474
? '%old_sound_rabbit_mq.lazy.connection.class%'
7575
: '%old_sound_rabbit_mq.connection.class%';
7676

77-
$context = ! empty($connection['ssl_context'])
78-
? stream_context_create(array('ssl' => $connection['ssl_context'])) : null;
79-
$definition = new Definition($classParam, array(
80-
$connection['host'],
81-
$connection['port'],
82-
$connection['user'],
83-
$connection['password'],
84-
$connection['vhost'],
85-
false, // insist
86-
'AMQPLAIN', // login_method
87-
null, // login_response
88-
'en_US', // locale
89-
$connection['connection_timeout'],
90-
$connection['read_write_timeout'],
91-
$context, // context
92-
$connection['keepalive'],
93-
$connection['heartbeat'],
77+
$definition = new Definition('%old_sound_rabbit_mq.connection_factory.class%', array(
78+
$classParam, $connection,
9479
));
80+
$definition->setPublic(false);
81+
$factoryName = sprintf('old_sound_rabbit_mq.connection_factory.%s', $key);
82+
$this->container->setDefinition($factoryName, $definition);
83+
84+
$definition = new Definition($classParam);
85+
$definition->setFactoryService($factoryName);
86+
$definition->setFactoryMethod('createConnection');
9587

9688
$this->container->setDefinition(sprintf('old_sound_rabbit_mq.connection.%s', $key), $definition);
9789
}

RabbitMq/AMQPConnectionFactory.php

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace OldSound\RabbitMqBundle\RabbitMq;
4+
5+
class AMQPConnectionFactory
6+
{
7+
/** @var \ReflectionClass */
8+
private $class;
9+
10+
/** @var array */
11+
private $parameters = array(
12+
'host' => 'localhost',
13+
'port' => 5672,
14+
'user' => 'guest',
15+
'password' => 'guest',
16+
'vhost' => '/',
17+
'connection_timeout' => 3,
18+
'read_write_timeout' => 3,
19+
'ssl_context' => null,
20+
'keepalive' => false,
21+
'heartbeat' => 0,
22+
);
23+
24+
/**
25+
* Constructor
26+
*
27+
* @param string $class FQCN of AMQPConnection class to instantiate.
28+
* @param array $parameters Map containing parameters resolved by Extension.
29+
*/
30+
public function __construct($class, array $parameters)
31+
{
32+
$this->class = $class;
33+
$this->parameters = array_merge($this->parameters, $parameters);
34+
if (is_array($this->parameters['ssl_context'])) {
35+
$this->parameters['ssl_context'] = ! empty($this->parameters['ssl_context'])
36+
? stream_context_create(array('ssl' => $this->parameters['ssl_context']))
37+
: null;
38+
}
39+
}
40+
41+
public function createConnection()
42+
{
43+
return new $this->class(
44+
$this->parameters['host'],
45+
$this->parameters['port'],
46+
$this->parameters['user'],
47+
$this->parameters['password'],
48+
$this->parameters['vhost'],
49+
false, // insist
50+
'AMQPLAIN', // login_method
51+
null, // login_response
52+
'en_US', // locale
53+
$this->parameters['connection_timeout'],
54+
$this->parameters['read_write_timeout'],
55+
$this->parameters['ssl_context'],
56+
$this->parameters['keepalive'],
57+
$this->parameters['heartbeat']
58+
);
59+
}
60+
}

Resources/config/rabbitmq.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<parameters>
77
<parameter key="old_sound_rabbit_mq.connection.class">PhpAmqpLib\Connection\AMQPConnection</parameter>
88
<parameter key="old_sound_rabbit_mq.lazy.connection.class">PhpAmqpLib\Connection\AMQPLazyConnection</parameter>
9+
<parameter key="old_sound_rabbit_mq.connection_factory.class">OldSound\RabbitMqBundle\RabbitMq\AMQPConnectionFactory</parameter>
910
<parameter key="old_sound_rabbit_mq.producer.class">OldSound\RabbitMqBundle\RabbitMq\Producer</parameter>
1011
<parameter key="old_sound_rabbit_mq.consumer.class">OldSound\RabbitMqBundle\RabbitMq\Consumer</parameter>
1112
<parameter key="old_sound_rabbit_mq.multi_consumer.class">OldSound\RabbitMqBundle\RabbitMq\MultipleConsumer</parameter>

Tests/DependencyInjection/OldSoundRabbitMqExtensionTest.php

Lines changed: 66 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,22 @@ public function testFooConnectionDefinition()
1717

1818
$this->assertTrue($container->has('old_sound_rabbit_mq.connection.foo_connection'));
1919
$definition = $container->getDefinition('old_sound_rabbit_mq.connection.foo_connection');
20-
$this->assertEquals('foo_host', $definition->getArgument(0));
21-
$this->assertEquals(123, $definition->getArgument(1));
22-
$this->assertEquals('foo_user', $definition->getArgument(2));
23-
$this->assertEquals('foo_password', $definition->getArgument(3));
24-
$this->assertEquals('/foo', $definition->getArgument(4));
20+
$this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.foo_connection'));
21+
$factory = $container->getDefinition('old_sound_rabbit_mq.connection_factory.foo_connection');
22+
$this->assertEquals('old_sound_rabbit_mq.connection_factory.foo_connection', $definition->getFactoryService());
23+
$this->assertEquals(array(
24+
'host' => 'foo_host',
25+
'port' => 123,
26+
'user' => 'foo_user',
27+
'password' => 'foo_password',
28+
'vhost' => '/foo',
29+
'lazy' => false,
30+
'connection_timeout' => 3,
31+
'read_write_timeout' => 3,
32+
'ssl_context' => array(),
33+
'keepalive' => null,
34+
'heartbeat' => 0,
35+
), $factory->getArgument(1));
2536
$this->assertEquals('%old_sound_rabbit_mq.connection.class%', $definition->getClass());
2637
}
2738

@@ -31,18 +42,24 @@ public function testSslConnectionDefinition()
3142

3243
$this->assertTrue($container->has('old_sound_rabbit_mq.connection.ssl_connection'));
3344
$definition = $container->getDefinition('old_sound_rabbit_mq.connection.ssl_connection');
34-
$this->assertEquals('ssl_host', $definition->getArgument(0));
35-
$this->assertEquals(123, $definition->getArgument(1));
36-
$this->assertEquals('ssl_user', $definition->getArgument(2));
37-
$this->assertEquals('ssl_password', $definition->getArgument(3));
38-
$this->assertEquals('/ssl', $definition->getArgument(4));
39-
40-
$context = $definition->getArgument(11);
41-
$this->assertInternalType('resource', $context);
42-
$this->assertEquals('stream-context', get_resource_type($context));
43-
$options = stream_context_get_options($context);
44-
$this->assertEquals(array('ssl' => array('verify_peer' => false)), $options);
45-
45+
$this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.ssl_connection'));
46+
$factory = $container->getDefinition('old_sound_rabbit_mq.connection_factory.ssl_connection');
47+
$this->assertEquals('old_sound_rabbit_mq.connection_factory.ssl_connection', $definition->getFactoryService());
48+
$this->assertEquals(array(
49+
'host' => 'ssl_host',
50+
'port' => 123,
51+
'user' => 'ssl_user',
52+
'password' => 'ssl_password',
53+
'vhost' => '/ssl',
54+
'lazy' => false,
55+
'connection_timeout' => 3,
56+
'read_write_timeout' => 3,
57+
'ssl_context' => array(
58+
'verify_peer' => false,
59+
),
60+
'keepalive' => null,
61+
'heartbeat' => 0,
62+
), $factory->getArgument(1));
4663
$this->assertEquals('%old_sound_rabbit_mq.connection.class%', $definition->getClass());
4764
}
4865

@@ -52,11 +69,22 @@ public function testLazyConnectionDefinition()
5269

5370
$this->assertTrue($container->has('old_sound_rabbit_mq.connection.lazy_connection'));
5471
$definition = $container->getDefinition('old_sound_rabbit_mq.connection.lazy_connection');
55-
$this->assertEquals('lazy_host', $definition->getArgument(0));
56-
$this->assertEquals(456, $definition->getArgument(1));
57-
$this->assertEquals('lazy_user', $definition->getArgument(2));
58-
$this->assertEquals('lazy_password', $definition->getArgument(3));
59-
$this->assertEquals('/lazy', $definition->getArgument(4));
72+
$this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.lazy_connection'));
73+
$factory = $container->getDefinition('old_sound_rabbit_mq.connection_factory.lazy_connection');
74+
$this->assertEquals('old_sound_rabbit_mq.connection_factory.lazy_connection', $definition->getFactoryService());
75+
$this->assertEquals(array(
76+
'host' => 'lazy_host',
77+
'port' => 456,
78+
'user' => 'lazy_user',
79+
'password' => 'lazy_password',
80+
'vhost' => '/lazy',
81+
'lazy' => true,
82+
'connection_timeout' => 3,
83+
'read_write_timeout' => 3,
84+
'ssl_context' => array(),
85+
'keepalive' => null,
86+
'heartbeat' => 0,
87+
), $factory->getArgument(1));
6088
$this->assertEquals('%old_sound_rabbit_mq.lazy.connection.class%', $definition->getClass());
6189
}
6290

@@ -66,11 +94,22 @@ public function testDefaultConnectionDefinition()
6694

6795
$this->assertTrue($container->has('old_sound_rabbit_mq.connection.default'));
6896
$definition = $container->getDefinition('old_sound_rabbit_mq.connection.default');
69-
$this->assertEquals('localhost', $definition->getArgument(0));
70-
$this->assertEquals(5672, $definition->getArgument(1));
71-
$this->assertEquals('guest', $definition->getArgument(2));
72-
$this->assertEquals('guest', $definition->getArgument(3));
73-
$this->assertEquals('/', $definition->getArgument(4));
97+
$this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.default'));
98+
$factory = $container->getDefinition('old_sound_rabbit_mq.connection_factory.default');
99+
$this->assertEquals('old_sound_rabbit_mq.connection_factory.default', $definition->getFactoryService());
100+
$this->assertEquals(array(
101+
'host' => 'localhost',
102+
'port' => 5672,
103+
'user' => 'guest',
104+
'password' => 'guest',
105+
'vhost' => '/',
106+
'lazy' => false,
107+
'connection_timeout' => 3,
108+
'read_write_timeout' => 3,
109+
'ssl_context' => array(),
110+
'keepalive' => null,
111+
'heartbeat' => 0,
112+
), $factory->getArgument(1));
74113
$this->assertEquals('%old_sound_rabbit_mq.connection.class%', $definition->getClass());
75114
}
76115

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?php
2+
3+
namespace OldSound\RabbitMqBundle\Tests\RabbitMq;
4+
5+
use OldSound\RabbitMqBundle\RabbitMq\AMQPConnectionFactory;
6+
use OldSound\RabbitMqBundle\Tests\RabbitMq\Fixtures\AMQPConnection;
7+
8+
class AMQPConnectionFactoryTest extends \PHPUnit_Framework_TestCase
9+
{
10+
public function testDefaultValues()
11+
{
12+
$factory = new AMQPConnectionFactory(
13+
'OldSound\RabbitMqBundle\Tests\RabbitMq\Fixtures\AMQPConnection',
14+
array()
15+
);
16+
17+
/** @var AMQPConnection $instance */
18+
$instance = $factory->createConnection();
19+
$this->assertInstanceOf('OldSound\RabbitMqBundle\Tests\RabbitMq\Fixtures\AMQPConnection', $instance);
20+
$this->assertEquals(array(
21+
'localhost', // host
22+
5672, // port
23+
'guest', // user
24+
'guest', // password
25+
'/', // vhost
26+
false, // insist
27+
"AMQPLAIN", // login method
28+
null, // login response
29+
"en_US", // locale
30+
3, // connection timeout
31+
3, // read write timeout
32+
null, // context
33+
false, // keepalive
34+
0, // heartbeat
35+
), $instance->constructParams);
36+
}
37+
38+
public function testStandardConnectionParameters()
39+
{
40+
$factory = new AMQPConnectionFactory(
41+
'OldSound\RabbitMqBundle\Tests\RabbitMq\Fixtures\AMQPConnection',
42+
array(
43+
'host' => 'foo_host',
44+
'port' => 123,
45+
'user' => 'foo_user',
46+
'password' => 'foo_password',
47+
'vhost' => '/vhost',
48+
)
49+
);
50+
51+
/** @var AMQPConnection $instance */
52+
$instance = $factory->createConnection();
53+
$this->assertInstanceOf('OldSound\RabbitMqBundle\Tests\RabbitMq\Fixtures\AMQPConnection', $instance);
54+
$this->assertEquals(array(
55+
'foo_host', // host
56+
123, // port
57+
'foo_user', // user
58+
'foo_password', // password
59+
'/vhost', // vhost
60+
false, // insist
61+
"AMQPLAIN", // login method
62+
null, // login response
63+
"en_US", // locale
64+
3, // connection timeout
65+
3, // read write timeout
66+
null, // context
67+
false, // keepalive
68+
0, // heartbeat
69+
), $instance->constructParams);
70+
}
71+
72+
public function testSSLConnectionParameters()
73+
{
74+
$factory = new AMQPConnectionFactory(
75+
'OldSound\RabbitMqBundle\Tests\RabbitMq\Fixtures\AMQPConnection',
76+
array(
77+
'host' => 'ssl_host',
78+
'port' => 123,
79+
'user' => 'ssl_user',
80+
'password' => 'ssl_password',
81+
'vhost' => '/ssl',
82+
'ssl_context' => array(
83+
'verify_peer' => false,
84+
),
85+
)
86+
);
87+
88+
/** @var AMQPConnection $instance */
89+
$instance = $factory->createConnection();
90+
$this->assertInstanceOf('OldSound\RabbitMqBundle\Tests\RabbitMq\Fixtures\AMQPConnection', $instance);
91+
$this->assertArrayHasKey(11, $instance->constructParams);
92+
$context = $instance->constructParams[11];
93+
// unset to check whole array at once later
94+
$instance->constructParams[11] = null;
95+
$this->assertInternalType('resource', $context);
96+
$this->assertEquals('stream-context', get_resource_type($context));
97+
$options = stream_context_get_options($context);
98+
$this->assertEquals(array('ssl' => array('verify_peer' => false)), $options);
99+
$this->assertEquals(array(
100+
'ssl_host', // host
101+
123, // port
102+
'ssl_user', // user
103+
'ssl_password', // password
104+
'/ssl', // vhost
105+
false, // insist
106+
"AMQPLAIN", // login method
107+
null, // login response
108+
"en_US", // locale
109+
3, // connection timeout
110+
3, // read write timeout
111+
null, // context checked earlier
112+
false, // keepalive
113+
0, // heartbeat
114+
), $instance->constructParams);
115+
}
116+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace OldSound\RabbitMqBundle\Tests\RabbitMq\Fixtures;
4+
5+
class AMQPConnection
6+
{
7+
public $constructParams;
8+
9+
public function __construct()
10+
{
11+
// save params for direct access in tests
12+
$this->constructParams = func_get_args();
13+
}
14+
}

0 commit comments

Comments
 (0)