From 5f701e87dc461f836912205b6d2ef82ed9d96978 Mon Sep 17 00:00:00 2001 From: Anton Shabouta Date: Fri, 18 Jul 2025 03:19:23 +0300 Subject: [PATCH] Middleware sorting --- src/Builder.php | 14 +++++++++----- src/Remote/RemoteExtension.php | 11 ++++++++--- src/Retry/RetryExtension.php | 10 +++++++--- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/Builder.php b/src/Builder.php index 8015402..a11ac2c 100644 --- a/src/Builder.php +++ b/src/Builder.php @@ -15,7 +15,7 @@ final class Builder private array $handlers = []; /** - * @var array + * @var array> */ private array $middleware = []; @@ -31,9 +31,9 @@ public function handle(string $command, callable $handler): self return $this; } - public function middleware(Middleware $middleware): self + public function middleware(Middleware $middleware, int $sort = 0): self { - $this->middleware[get_class($middleware)] = $middleware; + $this->middleware[$sort][] = $middleware; return $this; } @@ -60,8 +60,12 @@ public function build(): Dispatcher if (!empty($this->middleware)) { $resolver = new MiddlewareResolver($resolver); - foreach ($this->middleware as $item) { - $resolver->register($item); + ksort($this->middleware); + + foreach ($this->middleware as $middlewares) { + foreach ($middlewares as $item) { + $resolver->register($item); + } } } diff --git a/src/Remote/RemoteExtension.php b/src/Remote/RemoteExtension.php index bf62e9b..fd8fb2c 100644 --- a/src/Remote/RemoteExtension.php +++ b/src/Remote/RemoteExtension.php @@ -9,6 +9,8 @@ final class RemoteExtension implements Extension { + private const SORT = 100; + private Transport $transport; private Serializer $serializer; @@ -19,8 +21,11 @@ final class RemoteExtension implements Extension Envelope::class, ]; - public function __construct(?Transport $transport = null, ?Serializer $serializer = null) - { + public function __construct( + ?Transport $transport = null, + ?Serializer $serializer = null, + private int $sort = self::SORT, + ) { $this->transport = $transport ?? new Transport\MemoryTransport(); $this->serializer = $serializer ?? new Serializer\NativeSerializer(); } @@ -38,7 +43,7 @@ public function setup(Builder $builder): void $gateway = new Gateway($this->transport, $this->serializer); - $builder->middleware(new RemoteMiddleware($gateway, $this->local)); + $builder->middleware(new RemoteMiddleware($gateway, $this->local), $this->sort); $builder->handle(Envelope::class, [$gateway, 'receive']); } } diff --git a/src/Retry/RetryExtension.php b/src/Retry/RetryExtension.php index aabb601..d93ee0f 100644 --- a/src/Retry/RetryExtension.php +++ b/src/Retry/RetryExtension.php @@ -9,6 +9,8 @@ final class RetryExtension implements Extension { + private const SORT = 100; + private Policy $default; /** @@ -16,8 +18,10 @@ final class RetryExtension implements Extension */ private array $policies = []; - public function __construct(?Policy $default = null) - { + public function __construct( + ?Policy $default = null, + private int $sort = self::SORT, + ) { $this->default = $default ?? new Policy\ThrowPolicy(); } @@ -28,6 +32,6 @@ public function policy(string $class, Policy $policy): void public function setup(Builder $builder): void { - $builder->middleware(new RetryMiddleware($this->default, $this->policies)); + $builder->middleware(new RetryMiddleware($this->default, $this->policies), $this->sort); } }