Skip to content

Commit 986a4e9

Browse files
authored
Fix #29: Defer middleware creation when building a stack (#32)
1 parent 985f18d commit 986a4e9

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

src/MiddlewareDispatcher.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,13 @@ public function hasMiddlewares(): bool
8787
}
8888

8989
/**
90-
* @return MiddlewareInterface[]
90+
* @return \Closure[]
9191
*/
9292
private function buildMiddlewares(): array
9393
{
9494
$middlewares = [];
9595
foreach ($this->middlewareDefinitions as $middlewareDefinition) {
96-
$middlewares[] = $this->middlewareFactory->create($middlewareDefinition);
96+
$middlewares[] = fn (): MiddlewareInterface => $this->middlewareFactory->create($middlewareDefinition);
9797
}
9898

9999
return $middlewares;

src/MiddlewareStack.php

+11-8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Yiisoft\Middleware\Dispatcher;
66

7+
use Closure;
78
use Psr\EventDispatcher\EventDispatcherInterface;
89
use Psr\Http\Message\ResponseInterface;
910
use Psr\Http\Message\ServerRequestInterface;
@@ -27,7 +28,7 @@ final class MiddlewareStack implements RequestHandlerInterface
2728
private array $middlewares;
2829

2930
/**
30-
* @param MiddlewareInterface[] $middlewares Middlewares.
31+
* @param Closure[] $middlewares Middlewares.
3132
* @param RequestHandlerInterface $fallbackHandler Fallback handler
3233
* @param EventDispatcherInterface $eventDispatcher Event dispatcher to use for triggering before/after middleware
3334
* events.
@@ -57,7 +58,7 @@ private function build(): void
5758
{
5859
$handler = $this->fallbackHandler;
5960

60-
/** @var MiddlewareInterface $middleware */
61+
/** @var Closure $middleware */
6162
foreach ($this->middlewares as $middleware) {
6263
$handler = $this->wrap($middleware, $handler);
6364
}
@@ -68,15 +69,15 @@ private function build(): void
6869
/**
6970
* Wrap handler by middlewares.
7071
*/
71-
private function wrap(MiddlewareInterface $middleware, RequestHandlerInterface $handler): RequestHandlerInterface
72+
private function wrap(Closure $middleware, RequestHandlerInterface $handler): RequestHandlerInterface
7273
{
7374
return new class($middleware, $handler, $this->eventDispatcher) implements RequestHandlerInterface {
74-
private MiddlewareInterface $middleware;
75+
private Closure $middleware;
7576
private RequestHandlerInterface $handler;
7677
private EventDispatcherInterface $eventDispatcher;
7778

7879
public function __construct(
79-
MiddlewareInterface $middleware,
80+
Closure $middleware,
8081
RequestHandlerInterface $handler,
8182
EventDispatcherInterface $eventDispatcher
8283
) {
@@ -87,12 +88,14 @@ public function __construct(
8788

8889
public function handle(ServerRequestInterface $request): ResponseInterface
8990
{
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));
9194

9295
try {
93-
return $response = $this->middleware->process($request, $this->handler);
96+
return $response = $middleware->process($request, $this->handler);
9497
} finally {
95-
$this->eventDispatcher->dispatch(new AfterMiddleware($this->middleware, $response ?? null));
98+
$this->eventDispatcher->dispatch(new AfterMiddleware($middleware, $response ?? null));
9699
}
97100
}
98101
};

0 commit comments

Comments
 (0)