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 \ArrayObject (iterator_to_array ($ middlewareHandlers , false ));
36
+ }
36
37
}
37
38
38
39
/**
@@ -41,37 +42,43 @@ public function __construct(iterable $middlewareHandlers = array())
41
42
public function dispatch ($ message )
42
43
{
43
44
if (!\is_object ($ message )) {
44
- throw new InvalidArgumentException (sprintf ('Invalid type for message argument. Expected object, but got "%s". ' , \gettype ($ message )));
45
+ throw new \ TypeError (sprintf ('Invalid argument provided to "%s()": expected object, but got %s. ' , __METHOD__ , \gettype ($ message )));
45
46
}
46
47
47
- return \call_user_func ($ this ->callableForNextMiddleware (0 , Envelope::wrap ($ message )), $ message );
48
- }
49
-
50
- private function callableForNextMiddleware (int $ index , Envelope $ currentEnvelope ): callable
51
- {
52
- if (null === $ this ->indexedMiddlewareHandlers ) {
53
- $ this ->indexedMiddlewareHandlers = \is_array ($ this ->middlewareHandlers ) ? array_values ($ this ->middlewareHandlers ) : iterator_to_array ($ this ->middlewareHandlers , false );
48
+ $ middlewareIterator = $ this ->middlewareAggregate ->getIterator ();
49
+ while (!$ middlewareIterator instanceof \Iterator) {
50
+ $ middlewareIterator = $ middlewareIterator ->getIterator ();
54
51
}
55
52
56
- if (!isset ($ this ->indexedMiddlewareHandlers [$ index ])) {
57
- return function () {};
58
- }
53
+ foreach ($ middlewareIterator as $ middleware ) {
54
+ $ currentEnvelope = Envelope::wrap ($ message );
55
+
56
+ // Do not provide the envelope if the middleware cannot read it:
57
+ $ message = $ middleware instanceof EnvelopeAwareInterface ? $ currentEnvelope : $ currentEnvelope ->getMessage ();
58
+
59
+ $ next = static function ($ message ) use ($ middlewareIterator , &$ currentEnvelope , &$ next ) {
60
+ $ middlewareIterator ->next ();
59
61
60
- $ middleware = $ this ->indexedMiddlewareHandlers [$ index ];
62
+ if (!$ middlewareIterator ->valid ()) {
63
+ return ;
64
+ }
61
65
62
- return function ($ message ) use ($ middleware , $ index , $ currentEnvelope ) {
63
- if ($ message instanceof Envelope) {
64
- $ currentEnvelope = $ message ;
65
- } else {
66
- $ message = $ currentEnvelope ->withMessage ($ message );
67
- }
66
+ $ middleware = $ middlewareIterator ->current ();
68
67
69
- if (!$ middleware instanceof EnvelopeAwareInterface) {
70
- // Do not provide the envelope if the middleware cannot read it:
71
- $ message = $ message ->getMessage ();
72
- }
68
+ if ($ message instanceof Envelope) {
69
+ $ currentEnvelope = $ message ;
70
+ } else {
71
+ $ message = $ currentEnvelope ->withMessage ($ message );
72
+ }
73
73
74
- return $ middleware ->handle ($ message , $ this ->callableForNextMiddleware ($ index + 1 , $ currentEnvelope ));
75
- };
74
+ if (!$ middleware instanceof EnvelopeAwareInterface) {
75
+ $ message = $ message ->getMessage ();
76
+ }
77
+
78
+ return $ middleware ->handle ($ message , $ next );
79
+ };
80
+
81
+ return $ middleware ->handle ($ message , $ next);
82
+ }
76
83
}
77
84
}
0 commit comments