|
4 | 4 |
|
5 | 5 | namespace Tempest\Router; |
6 | 6 |
|
7 | | -use BackedEnum; |
8 | 7 | use Psr\Http\Message\ServerRequestInterface as PsrRequest; |
9 | 8 | use ReflectionClass; |
10 | 9 | use Tempest\Container\Container; |
|
14 | 13 | use Tempest\Http\Request; |
15 | 14 | use Tempest\Http\Response; |
16 | 15 | use Tempest\Http\Responses\Ok; |
17 | | -use Tempest\Reflection\ClassReflector; |
18 | 16 | use Tempest\Router\Exceptions\ControllerActionHadNoReturn; |
19 | | -use Tempest\Router\Exceptions\ControllerMethodHadNoRouteAttribute; |
20 | 17 | use Tempest\Router\Exceptions\MatchedRouteCouldNotBeResolved; |
21 | | -use Tempest\Router\Routing\Construction\DiscoveredRoute; |
22 | 18 | use Tempest\Router\Routing\Matching\RouteMatcher; |
23 | 19 | use Tempest\View\View; |
24 | 20 |
|
25 | 21 | use function Tempest\map; |
26 | | -use function Tempest\Support\Regex\replace; |
27 | | -use function Tempest\Support\str; |
28 | 22 |
|
29 | 23 | final readonly class GenericRouter implements Router |
30 | 24 | { |
@@ -98,79 +92,6 @@ private function getCallable(): HttpMiddlewareCallable |
98 | 92 | return $callable; |
99 | 93 | } |
100 | 94 |
|
101 | | - public function toUri(array|string $action, ...$params): string |
102 | | - { |
103 | | - if (is_string($action) && str_starts_with($action, '/')) { |
104 | | - $uri = $action; |
105 | | - } else { |
106 | | - [$controllerClass, $controllerMethod] = is_array($action) ? $action : [$action, '__invoke']; |
107 | | - |
108 | | - $routeAttribute = new ClassReflector($controllerClass) |
109 | | - ->getMethod($controllerMethod) |
110 | | - ->getAttribute(Route::class); |
111 | | - |
112 | | - if ($routeAttribute === null) { |
113 | | - throw new ControllerMethodHadNoRouteAttribute($controllerClass, $controllerMethod); |
114 | | - } |
115 | | - |
116 | | - $uri = $routeAttribute->uri; |
117 | | - } |
118 | | - |
119 | | - $uri = str($uri); |
120 | | - $queryParams = []; |
121 | | - |
122 | | - foreach ($params as $key => $value) { |
123 | | - if (! $uri->matches(sprintf('/\{%s(\}|:)/', $key))) { |
124 | | - $queryParams[$key] = $value; |
125 | | - |
126 | | - continue; |
127 | | - } |
128 | | - |
129 | | - if ($value instanceof BackedEnum) { |
130 | | - $value = $value->value; |
131 | | - } elseif ($value instanceof Bindable) { |
132 | | - foreach (new ClassReflector($value)->getPublicProperties() as $property) { |
133 | | - if (! $property->hasAttribute(IsBindingValue::class)) { |
134 | | - continue; |
135 | | - } |
136 | | - |
137 | | - $value = $property->getValue($value); |
138 | | - break; |
139 | | - } |
140 | | - } |
141 | | - |
142 | | - $uri = $uri->replaceRegex( |
143 | | - '#\{' . $key . DiscoveredRoute::ROUTE_PARAM_CUSTOM_REGEX . '\}#', |
144 | | - (string) $value, |
145 | | - ); |
146 | | - } |
147 | | - |
148 | | - $uri = $uri->prepend(rtrim($this->appConfig->baseUri, '/')); |
149 | | - |
150 | | - if ($queryParams !== []) { |
151 | | - return $uri->append('?' . http_build_query($queryParams))->toString(); |
152 | | - } |
153 | | - |
154 | | - return $uri->toString(); |
155 | | - } |
156 | | - |
157 | | - public function isCurrentUri(array|string $action, ...$params): bool |
158 | | - { |
159 | | - $matchedRoute = $this->container->get(MatchedRoute::class); |
160 | | - $candidateUri = $this->toUri($action, ...[...$matchedRoute->params, ...$params]); |
161 | | - $currentUri = $this->toUri([$matchedRoute->route->handler->getDeclaringClass(), $matchedRoute->route->handler->getName()]); |
162 | | - |
163 | | - foreach ($matchedRoute->params as $key => $value) { |
164 | | - if ($value instanceof BackedEnum) { |
165 | | - $value = $value->value; |
166 | | - } |
167 | | - |
168 | | - $currentUri = replace($currentUri, '/({' . preg_quote($key, '/') . '(?::.*?)?})/', $value); |
169 | | - } |
170 | | - |
171 | | - return $currentUri === $candidateUri; |
172 | | - } |
173 | | - |
174 | 95 | private function createResponse(string|array|Response|View $input): Response |
175 | 96 | { |
176 | 97 | if ($input instanceof View || is_array($input) || is_string($input)) { |
|
0 commit comments