11
11
12
12
namespace Symfony \Component \Messenger ;
13
13
14
- use Symfony \Component \Messenger \Exception \InvalidArgumentException ;
15
14
use Symfony \Component \Messenger \Middleware \MiddlewareInterface ;
16
15
17
16
/**
18
17
* @author Samuel Roze <samuel.roze@gmail.com>
19
18
* @author Matthias Noback <matthiasnoback@gmail.com>
19
+ * @author Nicolas Grekas <p@tchwork.com>
20
20
*/
21
21
class MessageBus implements MessageBusInterface
22
22
{
23
- private $ middlewareHandlers ;
24
-
25
- /**
26
- * @var MiddlewareInterface[]|null
27
- */
28
- private $ indexedMiddlewareHandlers ;
23
+ private $ middlewareAggregate ;
29
24
30
25
/**
31
26
* @param MiddlewareInterface[]|iterable $middlewareHandlers
32
27
*/
33
28
public function __construct (iterable $ middlewareHandlers = array ())
34
29
{
35
- $ this ->middlewareHandlers = $ middlewareHandlers ;
30
+ if ($ middlewareHandlers instanceof \IteratorAggregate) {
31
+ $ this ->middlewareAggregate = $ middlewareHandlers ;
32
+ } elseif (\is_array ($ middlewareHandlers )) {
33
+ $ this ->middlewareAggregate = new \ArrayObject ($ middlewareHandlers );
34
+ } else {
35
+ $ this ->middlewareAggregate = new class () {
36
+ public $ aggregate ;
37
+ public $ iterator ;
38
+
39
+ public function getIterator ()
40
+ {
41
+ return $ this ->aggregate = new \ArrayObject (iterator_to_array ($ this ->iterator , false ));
42
+ }
43
+ };
44
+ $ this ->middlewareAggregate ->aggregate = &$ this ->middlewareAggregate ;
45
+ $ this ->middlewareAggregate ->iterator = $ middlewareHandlers ;
46
+ }
36
47
}
37
48
38
49
/**
@@ -41,24 +52,26 @@ public function __construct(iterable $middlewareHandlers = array())
41
52
public function dispatch ($ message ): void
42
53
{
43
54
if (!\is_object ($ message )) {
44
- throw new InvalidArgumentException (sprintf ('Invalid type for message argument. Expected object, but got "%s". ' , \gettype ($ message )));
55
+ throw new \ TypeError (sprintf ('Invalid argument provided to "%s()": expected object, but got %s. ' , __METHOD__ , \gettype ($ message )));
45
56
}
57
+ $ middlewareIterator = $ this ->middlewareAggregate ->getIterator ();
46
58
47
- $ this ->callableForNextMiddleware (0 )($ message instanceof Envelope ? $ message : new Envelope ($ message ));
48
- }
49
-
50
- private function callableForNextMiddleware (int $ index ): callable
51
- {
52
- if (null === $ this ->indexedMiddlewareHandlers ) {
53
- $ this ->indexedMiddlewareHandlers = \is_array ($ this ->middlewareHandlers ) ? array_values ($ this ->middlewareHandlers ) : iterator_to_array ($ this ->middlewareHandlers , false );
59
+ while ($ middlewareIterator instanceof \IteratorAggregate) {
60
+ $ middlewareIterator = $ middlewareIterator ->getIterator ();
54
61
}
62
+ $ middlewareIterator ->rewind ();
55
63
56
- if (!isset ( $ this -> indexedMiddlewareHandlers [ $ index ] )) {
57
- return static function () {} ;
64
+ if (!$ middlewareIterator -> valid ( )) {
65
+ return ;
58
66
}
67
+ $ next = static function (Envelope $ envelope ) use ($ middlewareIterator , &$ next ) {
68
+ $ middlewareIterator ->next ();
59
69
60
- return function (Envelope $ envelope ) use ($ index ) {
67ED
td>61
- $ this ->indexedMiddlewareHandlers [$ index ]->handle ($ envelope , $ this ->callableForNextMiddleware ($ index + 1 ));
70
+ if ($ middlewareIterator ->valid ()) {
71
+ $ middlewareIterator ->current ()->handle ($ envelope , $ next );
72
+ }
62
73
};
74
+
75
+ $ middlewareIterator ->current ()->handle ($ message instanceof Envelope ? $ message : new Envelope ($ message ), $ next );
63
76
}
64
77
}
0 commit comments