4
4
5
5
namespace Yiisoft \Middleware \Dispatcher ;
6
6
7
+ use Closure ;
7
8
use Psr \EventDispatcher \EventDispatcherInterface ;
8
9
use Psr \Http \Message \ResponseInterface ;
9
10
use Psr \Http \Message \ServerRequestInterface ;
@@ -27,7 +28,7 @@ final class MiddlewareStack implements RequestHandlerInterface
27
28
private array $ middlewares ;
28
29
29
30
/**
30
- * @param MiddlewareInterface [] $middlewares Middlewares.
31
+ * @param Closure [] $middlewares Middlewares.
31
32
* @param RequestHandlerInterface $fallbackHandler Fallback handler
32
33
* @param EventDispatcherInterface $eventDispatcher Event dispatcher to use for triggering before/after middleware
33
34
* events.
@@ -57,7 +58,7 @@ private function build(): void
57
58
{
58
59
$ handler = $ this ->fallbackHandler ;
59
60
60
- /** @var MiddlewareInterface $middleware */
61
+ /** @var Closure $middleware */
61
62
foreach ($ this ->middlewares as $ middleware ) {
62
63
$ handler = $ this ->wrap ($ middleware , $ handler );
63
64
}
@@ -68,15 +69,15 @@ private function build(): void
68
69
/**
69
70
* Wrap handler by middlewares.
70
71
*/
71
- private function wrap (MiddlewareInterface $ middleware , RequestHandlerInterface $ handler ): RequestHandlerInterface
72
+ private function wrap (Closure $ middleware , RequestHandlerInterface $ handler ): RequestHandlerInterface
72
73
{
73
74
return new class ($ middleware , $ handler , $ this ->eventDispatcher ) implements RequestHandlerInterface {
74
- private MiddlewareInterface $ middleware ;
75
+ private Closure $ middleware ;
75
76
private RequestHandlerInterface $ handler ;
76
77
private EventDispatcherInterface $ eventDispatcher ;
77
78
78
79
public function __construct (
79
- MiddlewareInterface $ middleware ,
80
+ Closure $ middleware ,
80
81
RequestHandlerInterface $ handler ,
81
82
EventDispatcherInterface $ eventDispatcher
82
83
) {
@@ -87,12 +88,14 @@ public function __construct(
87
88
88
89
public function handle (ServerRequestInterface $ request ): ResponseInterface
89
90
{
90
- $ this ->eventDispatcher ->dispatch (new BeforeMiddleware ($ this ->middleware , $ request ));
91
+ /** @var MiddlewareInterface $middleware */
92
+ $ middleware = ($ this ->middleware )();
93
+ $ this ->eventDispatcher ->dispatch (new BeforeMiddleware ($ middleware , $ request ));
91
94
92
95
try {
93
- return $ response = $ this -> middleware ->process ($ request , $ this ->handler );
96
+ return $ response = $ middleware ->process ($ request , $ this ->handler );
94
97
} finally {
95
- $ this ->eventDispatcher ->dispatch (new AfterMiddleware ($ this -> middleware , $ response ?? null ));
98
+ $ this ->eventDispatcher ->dispatch (new AfterMiddleware ($ middleware , $ response ?? null ));
96
99
}
97
100
}
98
101
};
0 commit comments