Skip to content

Commit da6665c

Browse files
authored
feat(core): add middleware priority and discovery (#1109)
1 parent 9c84c68 commit da6665c

File tree

60 files changed

+649
-119
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+649
-119
lines changed

src/Tempest/Auth/src/AuthBootstrap.php

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/Tempest/Auth/src/AuthorizerMiddleware.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
namespace Tempest\Auth;
66

77
use Tempest\Container\Container;
8+
use Tempest\Core\Priority;
89
use Tempest\Router\HttpMiddleware;
910
use Tempest\Router\HttpMiddlewareCallable;
1011
use Tempest\Router\MatchedRoute;
1112
use Tempest\Router\Request;
1213
use Tempest\Router\Response;
1314
use Tempest\Router\Responses\Forbidden;
1415

16+
#[Priority(Priority::HIGHEST)]
1517
final readonly class AuthorizerMiddleware implements HttpMiddleware
1618
{
1719
public function __construct(

src/Tempest/CommandBus/src/AsyncCommandMiddleware.php

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,16 @@
55
namespace Tempest\CommandBus;
66

77
use Symfony\Component\Uid\Uuid;
8-
use Tempest\Core\KernelEvent;
9-
use Tempest\EventBus\EventHandler;
8+
use Tempest\Core\Priority;
109
use Tempest\Reflection\ClassReflector;
1110

11+
#[Priority(Priority::FRAMEWORK)]
1212
final readonly class AsyncCommandMiddleware implements CommandBusMiddleware
1313
{
1414
public function __construct(
15-
private CommandBusConfig $commandBusConfig,
1615
private CommandRepository $repository,
1716
) {}
1817

19-
#[EventHandler(KernelEvent::BOOTED)]
20-
public function onBooted(): void
21-
{
22-
$this->commandBusConfig->addMiddleware(self::class);
23-
}
24-
2518
public function __invoke(object $command, CommandBusMiddlewareCallable $next): void
2619
{
2720
$reflector = new ClassReflector($command);

src/Tempest/CommandBus/src/CommandBusConfig.php

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Tempest\CommandBus;
66

77
use Tempest\CommandBus\AsyncCommandRepositories\FileCommandRepository;
8+
use Tempest\Core\Middleware;
89
use Tempest\Reflection\MethodReflector;
910

1011
final class CommandBusConfig
@@ -13,8 +14,8 @@ public function __construct(
1314
/** @var \Tempest\CommandBus\CommandHandler[] */
1415
public array $handlers = [],
1516

16-
/** @var array<array-key, class-string<\Tempest\CommandBus\CommandBusMiddleware>> */
17-
public array $middleware = [],
17+
/** @var Middleware<\Tempest\CommandBus\CommandBusMiddleware> */
18+
public Middleware $middleware = new Middleware(),
1819

1920
/** @var class-string<\Tempest\CommandBus\CommandRepository> $commandRepositoryClass */
2021
public string $commandRepositoryClass = FileCommandRepository::class,
@@ -35,12 +36,4 @@ public function addHandler(CommandHandler $commandHandler, string $commandName,
3536

3637
return $this;
3738
}
38-
39-
/** @param class-string<\Tempest\CommandBus\CommandBusMiddleware> $middlewareClass */
40-
public function addMiddleware(string $middlewareClass): self
41-
{
42-
$this->middleware[] = $middlewareClass;
43-
44-
return $this;
45-
}
4639
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace Tempest\CommandBus;
4+
5+
use Tempest\Discovery\Discovery;
6+
use Tempest\Discovery\DiscoveryLocation;
7+
use Tempest\Discovery\IsDiscovery;
8+
use Tempest\Reflection\ClassReflector;
9+
10+
final class CommandBusMiddlewareDiscovery implements Discovery
11+
{
12+
use IsDiscovery;
13+
14+
public function __construct(
15+
private readonly CommandBusConfig $commandBusConfig,
16+
) {}
17+
18+
public function discover(DiscoveryLocation $location, ClassReflector $class): void
19+
{
20+
if ($class->implements(CommandBusMiddleware::class)) {
21+
$this->discoveryItems->add($location, $class->getName());
22+
}
23+
}
24+
25+
public function apply(): void
26+
{
27+
$this->commandBusConfig->middleware->add(...$this->discoveryItems);
28+
}
29+
}

src/Tempest/CommandBus/src/GenericCommandBus.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ private function getCallable(CommandHandler $commandHandler): CommandBusMiddlewa
4242

4343
$middlewareStack = $this->commandBusConfig->middleware;
4444

45-
while ($middlewareClass = array_pop($middlewareStack)) {
45+
foreach ($middlewareStack->unwrap() as $middlewareClass) {
4646
$callable = new CommandBusMiddlewareCallable(
47-
fn (object $command) => $this->container->get($middlewareClass)($command, $callable),
47+
fn (object $command) => $this->container->get($middlewareClass->getName())($command, $callable),
4848
);
4949
}
5050

src/Tempest/Console/src/Actions/ExecuteConsoleCommand.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,14 @@ private function getCallable(array $commandMiddleware): ConsoleMiddlewareCallabl
6868
return $exitCode ?? ExitCode::SUCCESS;
6969
});
7070

71-
$middlewareStack = [...$this->consoleConfig->middleware, ...$commandMiddleware];
71+
$middleware = $this->consoleConfig
72+
->middleware
73+
->clone()
74+
->add(...$commandMiddleware);
7275

73-
while ($middlewareClass = array_pop($middlewareStack)) {
76+
foreach ($middleware->unwrap() as $middlewareClass) {
7477
$callable = new ConsoleMiddlewareCallable(
75-
fn (Invocation $invocation) => $this->container->get($middlewareClass)($invocation, $callable),
78+
fn (Invocation $invocation) => $this->container->get($middlewareClass->getName())($invocation, $callable),
7679
);
7780
}
7881

src/Tempest/Console/src/ConsoleConfig.php

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Tempest\Console\Middleware\InvalidCommandMiddleware;
1010
use Tempest\Console\Middleware\OverviewMiddleware;
1111
use Tempest\Console\Middleware\ResolveOrRescueMiddleware;
12+
use Tempest\Core\Middleware;
1213
use Tempest\Reflection\MethodReflector;
1314

1415
final class ConsoleConfig
@@ -20,14 +21,8 @@ public function __construct(
2021
public array $commands = [],
2122
public ?string $logPath = null,
2223

23-
/** @var array<array-key, class-string<\Tempest\Console\ConsoleMiddleware>> */
24-
public array $middleware = [
25-
OverviewMiddleware::class,
26-
ConsoleExceptionMiddleware::class,
27-
ResolveOrRescueMiddleware::class,
28-
InvalidCommandMiddleware::class,
29-
HelpMiddleware::class,
30-
],
24+
/** @var Middleware<\Tempest\Console\ConsoleMiddleware> */
25+
public Middleware $middleware = new Middleware(),
3126
) {}
3227

3328
public function addCommand(MethodReflector $handler, ConsoleCommand $consoleCommand): self
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Tempest\Console\Discovery;
4+
5+
use Tempest\Console\ConsoleConfig;
6+
use Tempest\Console\ConsoleMiddleware;
7+
use Tempest\Discovery\Discovery;
8+
use Tempest\Discovery\DiscoveryLocation;
9+
use Tempest\Discovery\IsDiscovery;
10+
use Tempest\Reflection\ClassReflector;
11+
12+
final class ConsoleMiddlewareDiscovery implements Discovery
13+
{
14+
use IsDiscovery;
15+
16+
public function __construct(
17+
private readonly ConsoleConfig $consoleConfig,
18+
) {}
19+
20+
public function discover(DiscoveryLocation $location, ClassReflector $class): void
21+
{
22+
if ($class->implements(ConsoleMiddleware::class)) {
23+
$this->discoveryItems->add($location, $class->getName());
24+
}
25+
}
26+
27+
public function apply(): void
28+
{
29+
$this->consoleConfig->middleware->add(...$this->discoveryItems);
30+
}
31+
}

src/Tempest/Console/src/Middleware/CautionMiddleware.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
use Tempest\Console\ExitCode;
1111
use Tempest\Console\Initializers\Invocation;
1212
use Tempest\Core\AppConfig;
13+
use Tempest\Discovery\DoNotDiscover;
1314

15+
#[DoNotDiscover]
1416
final readonly class CautionMiddleware implements ConsoleMiddleware
1517
{
1618
public function __construct(

0 commit comments

Comments
 (0)