Skip to content

Commit eae5298

Browse files
committed
wip
1 parent 94db3bd commit eae5298

File tree

6 files changed

+37
-19
lines changed

6 files changed

+37
-19
lines changed

packages/router/src/GenericRouter.php

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,6 @@ private function getCallable(): HttpMiddlewareCallable
8383
)) {
8484
return $callable($request);
8585
}
86-
87-
// Skip middleware that sets cookies or session values when the route is stateless
88-
if (
89-
$matchedRoute->route->handler->hasAttribute(Stateless::class)
90-
&& in_array(
91-
needle: $middlewareClass->getName(),
92-
haystack: [
93-
VerifyCsrfMiddleware::class,
94-
SetCurrentUrlMiddleware::class,
95-
SetCookieMiddleware::class,
96-
],
97-
strict: true,
98-
)
99-
) {
100-
return $callable($request);
101-
}
10286
}
10387

10488
/** @var HttpMiddleware $middleware */

packages/router/src/MatchRouteMiddleware.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ public function __invoke(Request $request, HttpMiddlewareCallable $next): Respon
3434
return new NotFound();
3535
}
3636

37+
// Apply route decorators
38+
$decorators = [
39+
...$matchedRoute->route->handler->getDeclaringClass()->getAttributes(RouteDecorator::class),
40+
...$matchedRoute->route->handler->getAttributes(RouteDecorator::class),
41+
];
42+
43+
/** @var \Tempest\Router\RouteDecorator $decorator */
44+
foreach ($decorators as $decorator) {
45+
$matchedRoute->route = $decorator->decorate($matchedRoute->route);
46+
}
47+
3748
// We register the matched route in the container, some internal framework components will need it
3849
$this->container->singleton(MatchedRoute::class, fn () => $matchedRoute);
3950

packages/router/src/MatchedRoute.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
use Tempest\Router\Routing\Construction\DiscoveredRoute;
88

9-
final readonly class MatchedRoute
9+
final class MatchedRoute
1010
{
1111
public function __construct(
1212
public DiscoveredRoute $route,
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace Tempest\Router;
4+
5+
use Tempest\Router\Routing\Construction\DiscoveredRoute;
6+
7+
interface RouteDecorator
8+
{
9+
public function decorate(DiscoveredRoute $route): DiscoveredRoute;
10+
}

packages/router/src/Routing/Construction/DiscoveredRoute.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use Tempest\Reflection\MethodReflector;
99
use Tempest\Router\Route;
1010

11-
final readonly class DiscoveredRoute implements Route
11+
final class DiscoveredRoute implements Route
1212
{
1313
public const string DEFAULT_MATCHING_GROUP = '[^/]++';
1414

packages/router/src/Stateless.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,24 @@
33
namespace Tempest\Router;
44

55
use Attribute;
6+
use Tempest\Http\Session\VerifyCsrfMiddleware;
7+
use Tempest\Router\Routing\Construction\DiscoveredRoute;
68

79
/**
810
* Mark a route handler as stateless, causing all cookie- and session-related middleware to be skipped.
911
*/
1012
#[Attribute(Attribute::TARGET_METHOD)]
11-
final class Stateless
13+
final class Stateless implements RouteDecorator
1214
{
15+
public function decorate(DiscoveredRoute $route): DiscoveredRoute
16+
{
17+
$route->without = [
18+
...$route->without,
19+
VerifyCsrfMiddleware::class,
20+
SetCurrentUrlMiddleware::class,
21+
SetCookieMiddleware::class,
22+
];
23+
24+
return $route;
25+
}
1326
}

0 commit comments

Comments
 (0)