Skip to content

Commit ca234ff

Browse files
committed
Add support for named providers and multiple providers that use the same driver
1 parent 4644873 commit ca234ff

4 files changed

Lines changed: 135 additions & 43 deletions

File tree

src/DependencyInjection/Configuration.php

Lines changed: 65 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -56,39 +56,76 @@ private function getProvidersNode()
5656
{
5757
$treeBuilder = new TreeBuilder();
5858
$node = $treeBuilder->root('providers');
59+
$requirements = [
60+
'aws' => ['key', 'secret'],
61+
'ironmq' => ['token', 'project_id'],
62+
'sync' => [],
63+
];
5964

6065
$node
61-
->children()
62-
->arrayNode('aws')
63-
->children()
64-
->scalarNode('key')->end()
65-
->scalarNode('secret')->end()
66-
->scalarNode('region')
67-
->defaultValue('us-east-1')
68-
->end()
66+
->beforeNormalization()
67+
->always(function (array $providers) use ($requirements) {
68+
array_walk(
69+
$providers,
70+
function (&$provider, $name) use ($requirements) {
71+
if (
72+
empty($provider['driver']) &&
73+
array_key_exists($name, $requirements)
74+
) {
75+
$provider['driver'] = $name;
76+
}
77+
}
78+
);
79+
80+
return $providers;
81+
})
82+
->end()
83+
->useAttributeAsKey('name')
84+
->prototype('array')
85+
->treatNullLike([])
86+
->children()
87+
->enumNode('driver')
88+
->values(array_keys($requirements))
6989
->end()
70-
->end()
71-
->arrayNode('ironmq')
72-
->children()
73-
->scalarNode('token')->end()
74-
->scalarNode('project_id')->end()
75-
->enumNode('host')
76-
->defaultValue('mq-aws-us-east-1')
77-
->values([
78-
'mq-aws-us-east-1',
79-
'mq-aws-eu-west-1',
80-
'mq-rackspace-ord',
81-
'mq-rackspace-lon'
82-
])
83-
->end()
84-
->scalarNode('port')
85-
->defaultValue('443')
86-
->end()
87-
->scalarNode('api_version')
88-
->defaultValue(1)
89-
->end()
90+
// IronMQ
91+
->scalarNode('token')->end()
92+
->scalarNode('project_id')->end()
93+
->enumNode('host')
94+
->defaultValue('mq-aws-us-east-1')
95+
->values([
96+
'mq-aws-us-east-1',
97+
'mq-aws-eu-west-1',
98+
'mq-rackspace-ord',
99+
'mq-rackspace-lon',
100+
])
101+
->end()
102+
->scalarNode('port')
103+
->defaultValue('443')
104+
->end()
105+
->scalarNode('api_version')
106+
->defaultValue(1)
107+
->end()
108+
// AWS
109+
->scalarNode('key')->end()
110+
->scalarNode('secret')->end()
111+
->scalarNode('region')
112+
->defaultValue('us-east-1')
90113
->end()
91114
->end()
115+
116+
->validate()
117+
->always()
118+
->then(function (array $provider) use ($node, $requirements) {
119+
foreach ($requirements[$provider['driver']] as $requirement) {
120+
if (empty($provider[$requirement])) {
121+
throw new \InvalidArgumentException(
122+
sprintf('%s queue providers must have a %s; none provided', $provider['driver'], $requirement)
123+
);
124+
}
125+
}
126+
127+
return $provider;
128+
})
92129
->end()
93130
;
94131

src/DependencyInjection/UecodeQPushExtension.php

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,21 @@ public function load(array $configs, ContainerBuilder $container)
6060
$class = null;
6161
$client = null;
6262

63-
switch ($provider) {
63+
switch ($config['providers'][$provider]['driver']) {
6464
case 'aws':
6565
$class = $container->getParameter('uecode_qpush.provider.aws');
6666
$client = $this->createAwsClient(
6767
$config['providers'][$provider],
68-
$container
68+
$container,
69+
$provider
6970
);
7071
break;
7172
case 'ironmq':
7273
$class = $container->getParameter('uecode_qpush.provider.ironmq');
7374
$client = $this->createIronMQClient(
7475
$config['providers'][$provider],
75-
$container
76+
$container,
77+
$provider
7678
);
7779
break;
7880
case 'sync':
@@ -116,12 +118,15 @@ public function load(array $configs, ContainerBuilder $container)
116118
*
117119
* @param array $config A Configuration array for the client
118120
* @param ContainerBuilder $container The container
121+
* @param string $name The provider key
119122
*
120-
* return Reference
123+
* @return Reference
121124
*/
122-
private function createAwsClient($config, ContainerBuilder $container)
125+
private function createAwsClient($config, ContainerBuilder $container, $name)
123126
{
124-
if (!$container->hasDefinition('uecode_qpush.provider.aws')) {
127+
$service = sprintf('uecode_qpush.provider.%s', $name);
128+
129+
if (!$container->hasDefinition($service)) {
125130

126131
if (!class_exists('Aws\Common\Aws')) {
127132
throw new \RuntimeException(
@@ -140,24 +145,27 @@ private function createAwsClient($config, ContainerBuilder $container)
140145
]
141146
]);
142147

143-
$container->setDefinition('uecode_qpush.provider.aws', $aws)
148+
$container->setDefinition($service, $aws)
144149
->setPublic(false);
145150
}
146151

147-
return new Reference('uecode_qpush.provider.aws');
152+
return new Reference($service);
148153
}
149154

150155
/**
151156
* Creates a definition for the IronMQ provider
152157
*
153158
* @param array $config A Configuration array for the provider
154159
* @param ContainerBuilder $container The container
160+
* @param string $name The provider key
155161
*
156-
* return Reference
162+
* @return Reference
157163
*/
158-
private function createIronMQClient($config, ContainerBuilder $container)
164+
private function createIronMQClient($config, ContainerBuilder $container, $name)
159165
{
160-
if (!$container->hasDefinition('uecode_qpush.provider.ironmq')) {
166+
$service = sprintf('uecode_qpush.provider.%s', $name);
167+
168+
if (!$container->hasDefinition($service)) {
161169

162170
if (!class_exists('IronMQ')) {
163171
throw new \RuntimeException(
@@ -176,11 +184,11 @@ private function createIronMQClient($config, ContainerBuilder $container)
176184
]
177185
]);
178186

179-
$container->setDefinition('uecode_qpush.provider.ironmq', $ironmq)
187+
$container->setDefinition($service, $ironmq)
180188
->setPublic(false);
181189
}
182190

183-
return new Reference('uecode_qpush.provider.ironmq');
191+
return new Reference($service);
184192
}
185193

186194
private function createSyncClient()

tests/DependencyInjection/UecodeQPushExtensionTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,19 @@ public function testConfiguration()
6565
$this->container->compile();
6666

6767
$this->assertTrue($this->container->has('uecode_qpush'));
68+
6869
$this->assertTrue($this->container->has('uecode_qpush.test_aws'));
70+
$this->assertTrue($this->container->has('uecode_qpush.test_secondary_aws'));
71+
$this->assertNotSame(
72+
$this->container->get('uecode_qpush.test_aws'),
73+
$this->container->get('uecode_qpush.test_secondary_aws')
74+
);
75+
6976
$this->assertTrue($this->container->has('uecode_qpush.test_ironmq'));
77+
$this->assertTrue($this->container->has('uecode_qpush.test_secondary_ironmq'));
78+
$this->assertNotSame(
79+
$this->container->get('uecode_qpush.test_ironmq'),
80+
$this->container->get('uecode_qpush.test_secondary_ironmq')
81+
);
7082
}
7183
}

tests/Fixtures/config_test.yml

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,18 @@ uecode_qpush:
66
key: 123
77
secret: 123
88
region: us-east-1
9+
secondary_aws:
10+
driver: aws
11+
key: 234
12+
secret: 432
13+
region: eu-west-1
914
ironmq:
1015
token: 123
1116
project_id: 123
17+
secondary_ironmq:
18+
driver: ironmq
19+
token: 234
20+
project_id: 234
1221
queues:
1322
test_aws:
1423
provider: aws
@@ -22,6 +31,18 @@ uecode_qpush:
2231
receive_wait_time: 3
2332
subscribers:
2433
- { endpoint: http://example.com/qpush, protocol: http }
34+
test_secondary_aws:
35+
provider: secondary_aws
36+
options:
37+
push_notifications: true
38+
notification_retries: 3
39+
message_delay: 0
40+
message_timeout: 30
41+
message_expiration: 604800
42+
messages_to_receive: 1
43+
receive_wait_time: 3
44+
subscribers:
45+
- { endpoint: http://example.com/qpush, protocol: http }
2546
test_ironmq:
2647
provider: ironmq
2748
options:
@@ -34,9 +55,23 @@ uecode_qpush:
3455
receive_wait_time: 3
3556
subscribers:
3657
- { endpoint: http://example.com/qpush, protocol: http }
58+
test_secondary_ironmq:
59+
provider: secondary_ironmq
60+
options:
61+
push_notifications: true
62+
notification_retries: 3
63+
message_delay: 0
64+
message_timeout: 30
65+
message_expiration: 604800
66+
messages_to_receive: 1
67+
receive_wait_time: 3
68+
subscribers:
69+
- { endpoint: http://example.com/qpush, protocol: http }
3770

3871
services:
3972
event_dispatcher:
40-
class: stdObject
73+
class: stdClass
4174
logger:
42-
class: stdObject
75+
class: Symfony\Bridge\Monolog\Logger
76+
arguments:
77+
- 'test'

0 commit comments

Comments
 (0)