Skip to content

Commit 1bd7a67

Browse files
blackshadevbrendt
andauthored
refactor(http): refactor http route attribute (#793)
Co-authored-by: Brent Roose <[email protected]>
1 parent 839cf60 commit 1bd7a67

33 files changed

+379
-320
lines changed

src/Tempest/Router/src/Connect.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,19 @@
88
use Tempest\Http\Method;
99

1010
#[Attribute(Attribute::IS_REPEATABLE | Attribute::TARGET_METHOD)]
11-
final class Connect extends Route
11+
final class Connect implements Route
1212
{
13+
use IsRoute;
14+
15+
/**
16+
* @param class-string<HttpMiddleware>[] $middleware
17+
*/
1318
public function __construct(
1419
string $uri,
15-
16-
/**
17-
* @template MiddlewareClass of \Tempest\Router\HttpMiddleware
18-
* @var class-string<MiddlewareClass>[] $middleware
19-
*/
2020
array $middleware = [],
2121
) {
22-
parent::__construct(
23-
uri: $uri,
24-
method: Method::CONNECT,
25-
middleware: $middleware,
26-
);
22+
$this->uri = $uri;
23+
$this->method = Method::CONNECT;
24+
$this->middleware = $middleware;
2725
}
2826
}

src/Tempest/Router/src/Delete.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,19 @@
88
use Tempest\Http\Method;
99

1010
#[Attribute(Attribute::IS_REPEATABLE | Attribute::TARGET_METHOD)]
11-
final class Delete extends Route
11+
final class Delete implements Route
1212
{
13+
use IsRoute;
14+
15+
/**
16+
* @param class-string<HttpMiddleware>[] $middleware
17+
*/
1318
public function __construct(
1419
string $uri,
15-
16-
/**
17-
* @template MiddlewareClass of \Tempest\Router\HttpMiddleware
18-
* @var class-string<MiddlewareClass>[] $middleware
19-
*/
2020
array $middleware = [],
2121
) {
22-
parent::__construct(
23-
uri: $uri,
24-
method: Method::DELETE,
25-
middleware: $middleware,
26-
);
22+
$this->uri = $uri;
23+
$this->method = Method::DELETE;
24+
$this->middleware = $middleware;
2725
}
2826
}

src/Tempest/Router/src/Exceptions/ControllerActionHasNoReturn.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
namespace Tempest\Router\Exceptions;
66

77
use Exception;
8-
use Tempest\Router\Route;
8+
use Tempest\Router\Routing\Construction\DiscoveredRoute;
99

1010
final class ControllerActionHasNoReturn extends Exception
1111
{
12-
public function __construct(Route $route)
12+
public function __construct(DiscoveredRoute $route)
1313
{
1414
parent::__construct(sprintf(
1515
"The controller action %s::%s doesn't return a valid response",

src/Tempest/Router/src/GenericRouter.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Tempest\Router\Responses\Invalid;
1818
use Tempest\Router\Responses\NotFound;
1919
use Tempest\Router\Responses\Ok;
20+
use Tempest\Router\Routing\Construction\DiscoveredRoute;
2021
use Tempest\Router\Routing\Matching\RouteMatcher;
2122
use Tempest\Validation\Exceptions\ValidationException;
2223
use Tempest\View\View;
@@ -115,9 +116,10 @@ public function toUri(array|string $action, ...$params): string
115116
$controllerMethod = $reflection->getMethod('__invoke');
116117
}
117118

119+
/** @var Route|null $routeAttribute */
118120
$routeAttribute = $controllerMethod->getAttribute(Route::class);
119121

120-
$uri = $routeAttribute->uri;
122+
$uri = $routeAttribute->uri();
121123
} catch (ReflectionException) {
122124
if (is_array($action)) {
123125
throw new InvalidRouteException($action[0], $action[1]);
@@ -141,7 +143,7 @@ public function toUri(array|string $action, ...$params): string
141143
}
142144

143145
$uri = $uri->replaceRegex(
144-
'#\{' . $key . Route::ROUTE_PARAM_CUSTOM_REGEX . '\}#',
146+
'#\{' . $key . DiscoveredRoute::ROUTE_PARAM_CUSTOM_REGEX . '\}#',
145147
(string) $value,
146148
);
147149
}

src/Tempest/Router/src/Get.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,19 @@
88
use Tempest\Http\Method;
99

1010
#[Attribute(Attribute::IS_REPEATABLE | Attribute::TARGET_METHOD)]
11-
final class Get extends Route
11+
final class Get implements Route
1212
{
13+
use IsRoute;
14+
15+
/**
16+
* @param class-string<HttpMiddleware>[] $middleware
17+
*/
1318
public function __construct(
1419
string $uri,
15-
16-
/**
17-
* @template MiddlewareClass of \Tempest\Router\HttpMiddleware
18-
* @var class-string<MiddlewareClass>[] $middleware
19-
*/
2020
array $middleware = [],
2121
) {
22-
parent::__construct(
23-
uri: $uri,
24-
method: Method::GET,
25-
middleware: $middleware,
26-
);
22+
$this->uri = $uri;
23+
$this->method = Method::GET;
24+
$this->middleware = $middleware;
2725
}
2826
}

src/Tempest/Router/src/Head.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,19 @@
88
use Tempest\Http\Method;
99

1010
#[Attribute(Attribute::IS_REPEATABLE | Attribute::TARGET_METHOD)]
11-
final class Head extends Route
11+
final class Head implements Route
1212
{
13+
use IsRoute;
14+
15+
/**
16+
* @param class-string<HttpMiddleware>[] $middleware
17+
*/
1318
public function __construct(
1419
string $uri,
15-
16-
/**
17-
* @template MiddlewareClass of \Tempest\Router\HttpMiddleware
18-
* @var class-string<MiddlewareClass>[] $middleware
19-
*/
2020
array $middleware = [],
2121
) {
22-
parent::__construct(
23-
uri: $uri,
24-
method: Method::HEAD,
25-
middleware: $middleware,
26-
);
22+
$this->uri = $uri;
23+
$this->method = Method::HEAD;
24+
$this->middleware = $middleware;
2725
}
2826
}

src/Tempest/Router/src/IsRoute.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Router;
6+
7+
use Tempest\Http\Method;
8+
use Tempest\Reflection\MethodReflector;
9+
10+
trait IsRoute
11+
{
12+
private Method $method;
13+
14+
private string $uri;
15+
16+
/** @var class-string<HttpMiddleware>[] */
17+
private array $middleware;
18+
19+
private MethodReflector $handler;
20+
21+
public function method(): Method
22+
{
23+
return $this->method;
24+
}
25+
26+
public function uri(): string
27+
{
28+
return $this->uri;
29+
}
30+
31+
/** @return class-string<HttpMiddleware>[] */
32+
public function middleware(): array
33+
{
34+
return $this->middleware;
35+
}
36+
}

src/Tempest/Router/src/MatchedRoute.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44

55
namespace Tempest\Router;
66

7+
use Tempest\Router\Routing\Construction\DiscoveredRoute;
8+
79
final readonly class MatchedRoute
810
{
911
public function __construct(
10-
public Route $route,
12+
public DiscoveredRoute $route,
1113
public array $params,
1214
) {
1315
}

src/Tempest/Router/src/Options.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,19 @@
88
use Tempest\Http\Method;
99

1010
#[Attribute(Attribute::IS_REPEATABLE | Attribute::TARGET_METHOD)]
11-
final class Options extends Route
11+
final class Options implements Route
1212
{
13+
use IsRoute;
14+
15+
/**
16+
* @param class-string<HttpMiddleware>[] $middleware
17+
*/
1318
public function __construct(
1419
string $uri,
15-
16-
/**
17-
* @template MiddlewareClass of \Tempest\Router\HttpMiddleware
18-
* @var class-string<MiddlewareClass>[] $middleware
19-
*/
2020
array $middleware = [],
2121
) {
22-
parent::__construct(
23-
uri: $uri,
24-
method: Method::OPTIONS,
25-
middleware: $middleware,
26-
);
22+
$this->uri = $uri;
23+
$this->method = Method::OPTIONS;
24+
$this->middleware = $middleware;
2725
}
2826
}

src/Tempest/Router/src/Patch.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,19 @@
88
use Tempest\Http\Method;
99

1010
#[Attribute(Attribute::IS_REPEATABLE | Attribute::TARGET_METHOD)]
11-
final class Patch extends Route
11+
final class Patch implements Route
1212
{
13+
use IsRoute;
14+
15+
/**
16+
* @param class-string<HttpMiddleware>[] $middleware
17+
*/
1318
public function __construct(
1419
string $uri,
15-
16-
/**
17-
* @template MiddlewareClass of \Tempest\Router\HttpMiddleware
18-
* @var class-string<MiddlewareClass>[] $middleware
19-
*/
2020
array $middleware = [],
2121
) {
22-
parent::__construct(
23-
uri: $uri,
24-
method: Method::PATCH,
25-
middleware: $middleware,
26-
);
22+
$this->uri = $uri;
23+
$this->method = Method::PATCH;
24+
$this->middleware = $middleware;
2725
}
2826
}

0 commit comments

Comments
 (0)