Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions src/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ final class Builder
private array $handlers = [];

/**
* @var array<string, Middleware>
* @var array<int, array<Middleware>>
*/
private array $middleware = [];

Expand All @@ -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;
}
Expand All @@ -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);
}
}
}

Expand Down
11 changes: 8 additions & 3 deletions src/Remote/RemoteExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

final class RemoteExtension implements Extension
{
private const SORT = 100;

private Transport $transport;
private Serializer $serializer;

Expand All @@ -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();
}
Expand All @@ -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']);
}
}
10 changes: 7 additions & 3 deletions src/Retry/RetryExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,19 @@

final class RetryExtension implements Extension
{
private const SORT = 100;

private Policy $default;

/**
* @var array<string, Policy>
*/
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();
}

Expand All @@ -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);
}
}