Skip to content

Commit 9136100

Browse files
committed
Load bindings in config and extension
1 parent c5cc373 commit 9136100

File tree

5 files changed

+93
-1
lines changed

5 files changed

+93
-1
lines changed

DependencyInjection/Configuration.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public function getConfigTreeBuilder()
2828
;
2929

3030
$this->addConnections($rootNode);
31+
$this->addBindings($rootNode);
3132
$this->addProducers($rootNode);
3233
$this->addConsumers($rootNode);
3334
$this->addMultipleConsumers($rootNode);
@@ -71,6 +72,7 @@ protected function addConnections(ArrayNodeDefinition $node)
7172
;
7273
}
7374

75+
7476
protected function addProducers(ArrayNodeDefinition $node)
7577
{
7678
$node
@@ -93,6 +95,30 @@ protected function addProducers(ArrayNodeDefinition $node)
9395
;
9496
}
9597

98+
protected function addBindings(ArrayNodeDefinition $node)
99+
{
100+
$node
101+
->fixXmlConfig('binding')
102+
->children()
103+
->arrayNode('bindings')
104+
->canBeUnset()
105+
->prototype('array')
106+
->children()
107+
->scalarNode('connection')->defaultValue('default')->end()
108+
->scalarNode('exchange')->defaultNull()->end()
109+
->scalarNode('destination')->defaultNull()->end()
110+
->scalarNode('routing_key')->defaultNull()->end()
111+
->booleanNode('nowait')->defaultFalse()->end()
112+
->booleanNode('destination_is_exchange')->defaultFalse()->end()
113+
->variableNode('arguments')->defaultNull()->end()
114+
->scalarNode('class')->defaultValue('%old_sound_rabbit_mq.binding.class%')->end()
115+
->end()
116+
->end()
117+
->end()
118+
->end()
119+
;
120+
}
121+
96122
protected function addConsumers(ArrayNodeDefinition $node)
97123
{
98124
$node

DependencyInjection/OldSoundRabbitMqExtension.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public function load(array $configs, ContainerBuilder $container)
4646
$this->collectorEnabled = $this->config['enable_collector'];
4747

4848
$this->loadConnections();
49+
$this->loadBindings();
4950
$this->loadProducers();
5051
$this->loadConsumers();
5152
$this->loadMultipleConsumers();
@@ -96,6 +97,30 @@ protected function loadConnections()
9697
}
9798
}
9899

100+
protected function loadBindings()
101+
{
102+
if ($this->config['sandbox']) {
103+
return;
104+
}
105+
foreach ($this->config['bindings'] as $binding) {
106+
ksort($binding);
107+
$definition = new Definition($binding['class']);
108+
$definition->addTag('old_sound_rabbit_mq.binding');
109+
$definition->addMethodCall('setExchange', array($binding['exchange']));
110+
$definition->addMethodCall('setDestination', array($binding['destination']));
111+
$definition->addMethodCall('setRoutingKey', array($binding['routing_key']));
112+
$definition->addMethodCall('isNowait', array($binding['nowait']));
113+
$definition->addMethodCall('setDestinationIsExchange', array($binding['destination_is_exchange']));
114+
$this->injectConnection($definition, $binding['connection']);
115+
$key = md5(json_encode($binding));
116+
if ($this->collectorEnabled) {
117+
// in the context of a binding, I don't thing logged channels are needed?
118+
$this->injectLoggedChannel($definition, $key, $binding['connection']);
119+
}
120+
$this->container->setDefinition(sprintf('old_sound_rabbit_mq.%s_binding', $key), $definition);
121+
}
122+
}
123+
99124
protected function loadProducers()
100125
{
101126
if ($this->config['sandbox'] == false) {

Resources/config/rabbitmq.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
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>
99
<parameter key="old_sound_rabbit_mq.connection_factory.class">OldSound\RabbitMqBundle\RabbitMq\AMQPConnectionFactory</parameter>
10+
<parameter key="old_sound_rabbit_mq.binding.class">OldSound\RabbitMqBundle\RabbitMq\Binding</parameter>
1011
<parameter key="old_sound_rabbit_mq.producer.class">OldSound\RabbitMqBundle\RabbitMq\Producer</parameter>
1112
<parameter key="old_sound_rabbit_mq.consumer.class">OldSound\RabbitMqBundle\RabbitMq\Consumer</parameter>
1213
<parameter key="old_sound_rabbit_mq.multi_consumer.class">OldSound\RabbitMqBundle\RabbitMq\MultipleConsumer</parameter>

Tests/DependencyInjection/Fixtures/test.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,9 @@ old_sound_rabbit_mq:
138138
type: direct
139139
callback: bar.dynamic.callback
140140
queue_options_provider: bar.dynamic.provider
141-
141+
bindings:
142+
- {exchange: foo, destination: bar, routing_key: baz}
143+
- {exchange: moo, connection: default2, destination: cow, nowait: true, destination_is_exchange: true, arguments: {moo:cow}}
142144
anon_consumers:
143145
foo_anon_consumer:
144146
connection: foo_connection

Tests/DependencyInjection/OldSoundRabbitMqExtensionTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,44 @@ public function testDefaultConnectionDefinition()
113113
$this->assertEquals('%old_sound_rabbit_mq.connection.class%', $definition->getClass());
114114
}
115115

116+
public function testFooBinding()
117+
{
118+
$container = $this->getContainer('test.yml');
119+
$binding = array(
120+
'arguments' => null,
121+
'class' => '%old_sound_rabbit_mq.binding.class%',
122+
'connection' => 'default',
123+
'exchange' => 'foo',
124+
'destination' => 'bar',
125+
'destination_is_exchange' => false,
126+
'nowait' => false,
127+
'routing_key' => 'baz',
128+
);
129+
ksort($binding);
130+
$key = md5(json_encode($binding));
131+
$name = sprintf('old_sound_rabbit_mq.%s_binding', $key);
132+
$this->assertTrue($container->has($name));
133+
}
134+
135+
public function testMooBinding()
136+
{
137+
$container = $this->getContainer('test.yml');
138+
$binding = array(
139+
'arguments' => array('moo' => 'cow'),
140+
'class' => '%old_sound_rabbit_mq.binding.class%',
141+
'connection' => 'default2',
142+
'exchange' => 'moo',
143+
'destination' => 'cow',
144+
'destination_is_exchange' => true,
145+
'nowait' => true,
146+
'routing_key' => null,
147+
);
148+
ksort($binding);
149+
$key = md5(json_encode($binding));
150+
$name = sprintf('old_sound_rabbit_mq.%s_binding', $key);
151+
$this->assertTrue($container->has($name));
152+
}
153+
116154
public function testFooProducerDefinition()
117155
{
118156
$container = $this->getContainer('test.yml');

0 commit comments

Comments
 (0)