Skip to content

Commit 411932a

Browse files
committed
Enable dynamic queue configuration via the use of closures in queue_flags array
1 parent 4a11d75 commit 411932a

File tree

2 files changed

+83
-4
lines changed

2 files changed

+83
-4
lines changed

src/Queue/AMQPQueue.php

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Forumhouse\LaravelAmqp\Exception\AMQPException;
66
use Forumhouse\LaravelAmqp\Jobs\AMQPJob;
7+
use Forumhouse\LaravelAmqp\Utility\ArrayUtil;
78
use Illuminate\Queue\Queue;
89
use PhpAmqpLib\Channel\AMQPChannel;
910
use PhpAmqpLib\Connection\AMQPConnection;
@@ -211,7 +212,7 @@ protected function declareExchange($exchangeName, $exchangeType, array $exchange
211212
public function declareQueue($name)
212213
{
213214
$queue = $this->getQueueName($name);
214-
$flags = array_replace([
215+
$flags = array_replace_recursive([
215216
'queue' => $queue,
216217
'passive' => false,
217218
'durable' => false,
@@ -220,7 +221,7 @@ public function declareQueue($name)
220221
'nowait' => false,
221222
'arguments' => null,
222223
'ticket' => null,
223-
], $this->queueFlags);
224+
], $this->getQueueFlags($name));
224225

225226
call_user_func_array([$this->channel, 'queue_declare'], $flags);
226227
}
@@ -238,7 +239,7 @@ public function declareDelayedQueue($destinationQueueName, $delay)
238239
$destinationQueueName = $this->getQueueName($destinationQueueName);
239240
$deferredQueueName = $destinationQueueName . '_deferred_' . $delay;
240241

241-
$flags = array_replace([
242+
$flags = array_replace_recursive([
242243
'queue' => '',
243244
'passive' => false,
244245
'durable' => false,
@@ -247,7 +248,7 @@ public function declareDelayedQueue($destinationQueueName, $delay)
247248
'nowait' => false,
248249
'arguments' => null,
249250
'ticket' => null,
250-
], $this->queueFlags, [
251+
], $this->getQueueFlags($destinationQueueName, $deferredQueueName, $delay), [
251252
'queue' => $deferredQueueName,
252253
'durable' => true,
253254
'arguments' => [
@@ -277,4 +278,22 @@ protected function getQueueName($name)
277278
}
278279
return $name;
279280
}
281+
282+
/**
283+
* @param string $queueName
284+
* @param null|string $deferredQueueName
285+
* @param null|int $deferredQueueDelay
286+
*
287+
* @return array
288+
*/
289+
protected function getQueueFlags($queueName, $deferredQueueName = null, $deferredQueueDelay = null)
290+
{
291+
$result = ArrayUtil::arrayMapRecursive(function ($value) {
292+
return is_callable($value) ? call_user_func_array($value, func_get_args()) : $value;
293+
}, $this->queueFlags);
294+
295+
$result = ArrayUtil::removeNullsRecursive($result);
296+
297+
return $result;
298+
}
280299
}

src/Utility/ArrayUtil.php

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace Forumhouse\LaravelAmqp\Utility;
4+
5+
/**
6+
* Various array utilities
7+
*
8+
* @package Forumhouse\LaravelAmqp\Utility
9+
*/
10+
class ArrayUtil
11+
{
12+
/**
13+
* array_map_recursive, which is missing from PHP, with the same signature
14+
*
15+
* @param callable $func
16+
* @param array $arr
17+
*
18+
* @return array
19+
*/
20+
public static function arrayMapRecursive(callable $func, array $arr)
21+
{
22+
array_walk_recursive($arr, function (&$v) use ($func) {
23+
$v = $func($v);
24+
});
25+
return $arr;
26+
}
27+
28+
/**
29+
* array_filter_recursive which is missing from PHP
30+
*
31+
* @param array $input
32+
* @param callable $callback
33+
*
34+
* @return array
35+
*/
36+
public static function arrayFilterRecursive(array $input, callable $callback)
37+
{
38+
foreach ($input as &$value) {
39+
if (is_array($value)) {
40+
$value = static::arrayFilterRecursive($value, $callback);
41+
}
42+
}
43+
44+
return array_filter($input, $callback);
45+
}
46+
47+
/**
48+
* Returns array with all
49+
*
50+
* @param array $arr
51+
*
52+
* @return array
53+
*/
54+
public static function removeNullsRecursive(array $arr)
55+
{
56+
return static::arrayFilterRecursive($arr, function ($var) {
57+
return !is_null($var);
58+
});
59+
}
60+
}

0 commit comments

Comments
 (0)