@@ -69,33 +69,37 @@ private function build(): void
69
69
/**
70
70
* Wrap handler by middlewares.
71
71
*/
72
- private function wrap (Closure $ middleware , RequestHandlerInterface $ handler ): RequestHandlerInterface
72
+ private function wrap (Closure $ middlewareFactory , RequestHandlerInterface $ handler ): RequestHandlerInterface
73
73
{
74
- return new class ($ middleware , $ handler , $ this ->eventDispatcher ) implements RequestHandlerInterface {
75
- private Closure $ middleware ;
74
+ return new class ($ middlewareFactory , $ handler , $ this ->eventDispatcher ) implements RequestHandlerInterface {
75
+ private Closure $ middlewareFactory ;
76
+ private ?MiddlewareInterface $ middleware = null ;
76
77
private RequestHandlerInterface $ handler ;
77
78
private EventDispatcherInterface $ eventDispatcher ;
78
79
79
80
public function __construct (
80
- Closure $ middleware ,
81
+ Closure $ middlewareFactory ,
81
82
RequestHandlerInterface $ handler ,
82
83
EventDispatcherInterface $ eventDispatcher
83
84
) {
84
- $ this ->middleware = $ middleware ;
85
+ $ this ->middlewareFactory = $ middlewareFactory ;
85
86
$ this ->handler = $ handler ;
86
87
$ this ->eventDispatcher = $ eventDispatcher ;
87
88
}
88
89
89
90
public function handle (ServerRequestInterface $ request ): ResponseInterface
90
91
{
91
- /** @var MiddlewareInterface $middleware */
92
- $ middleware = ($ this ->middleware )();
93
- $ this ->eventDispatcher ->dispatch (new BeforeMiddleware ($ middleware , $ request ));
92
+ if ($ this ->middleware === null ) {
93
+ /** @var MiddlewareInterface */
94
+ $ this ->middleware = ($ this ->middlewareFactory )();
95
+ }
96
+
97
+ $ this ->eventDispatcher ->dispatch (new BeforeMiddleware ($ this ->middleware , $ request ));
94
98
95
99
try {
96
- return $ response = $ middleware ->process ($ request , $ this ->handler );
100
+ return $ response = $ this -> middleware ->process ($ request , $ this ->handler );
97
101
} finally {
98
- $ this ->eventDispatcher ->dispatch (new AfterMiddleware ($ middleware , $ response ?? null ));
102
+ $ this ->eventDispatcher ->dispatch (new AfterMiddleware ($ this -> middleware , $ response ?? null ));
99
103
}
100
104
}
101
105
};
0 commit comments