Start with controller parameter injection
diff --git a/src/Http/GenericRouter.php b/src/Http/GenericRouter.php index 23e9311..d5ffb95 100644 --- a/src/Http/GenericRouter.php +++ b/src/Http/GenericRouter.php @@ -22,16 +22,47 @@ class GenericRouter implements RouterInterface public function dispatch(RequestInterface $request): ResponseInterface { foreach ($this->config->getRoutes() as $route) { - if ($route->getRoute()->path === $request->getUri()) { - $controller = $this->container->get($route->getController()); - $method = $route->getMethod(); - return $controller->$method(...$this->autowire($route)); + $params = $this->resolveParams($route->getRoute()->path, $request->getUri()); + + if ($params === null) { + continue; } + + $controller = $this->container->get($route->getController()); + $method = $route->getMethod(); +// $params = $this->autowire($route) + $this->resolveParams($route->getRoute()->path, $request->getUri()); + $params = $this->resolveParams($route->getRoute()->path, $request->getUri()); + return $controller->$method(...$params); } throw new RouteNotFoundException($request); } + private function resolveParams(string $routeUri, string $requestUri): ?array + { + $result = preg_match_all('/{(\w+)}/', $routeUri, $tokens); + + if (!$result) { + return null; + } + + $tokens = $tokens[0]; + + $matchingRegex = '/^' . str_replace( + ['/', ...$tokens], + ['\/', ...array_fill(0, count($tokens), '([\w\s]+)')], + $routeUri + ) . '$/'; + + $result = preg_match($matchingRegex, $requestUri, $matches); + if ($result === 0) { + return []; + } + $matches = array_slice($matches, 1); + + return array_combine(array_map(fn($token) => trim($token, '{}'), $tokens), $matches); + } + private function autowire(RouteConfig $route): array { $reflectionMethod = new ReflectionMethod($route->getController(), $route->getMethod());
This commit is contained in:
parent
6f247f3ab7
commit
2fd6e50b90
@ -22,16 +22,47 @@ class GenericRouter implements RouterInterface
|
|||||||
public function dispatch(RequestInterface $request): ResponseInterface
|
public function dispatch(RequestInterface $request): ResponseInterface
|
||||||
{
|
{
|
||||||
foreach ($this->config->getRoutes() as $route) {
|
foreach ($this->config->getRoutes() as $route) {
|
||||||
if ($route->getRoute()->path === $request->getUri()) {
|
$params = $this->resolveParams($route->getRoute()->path, $request->getUri());
|
||||||
$controller = $this->container->get($route->getController());
|
|
||||||
$method = $route->getMethod();
|
if ($params === null) {
|
||||||
return $controller->$method(...$this->autowire($route));
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$controller = $this->container->get($route->getController());
|
||||||
|
$method = $route->getMethod();
|
||||||
|
// $params = $this->autowire($route) + $this->resolveParams($route->getRoute()->path, $request->getUri());
|
||||||
|
$params = $this->resolveParams($route->getRoute()->path, $request->getUri());
|
||||||
|
return $controller->$method(...$params);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new RouteNotFoundException($request);
|
throw new RouteNotFoundException($request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function resolveParams(string $routeUri, string $requestUri): ?array
|
||||||
|
{
|
||||||
|
$result = preg_match_all('/{(\w+)}/', $routeUri, $tokens);
|
||||||
|
|
||||||
|
if (!$result) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tokens = $tokens[0];
|
||||||
|
|
||||||
|
$matchingRegex = '/^' . str_replace(
|
||||||
|
['/', ...$tokens],
|
||||||
|
['\/', ...array_fill(0, count($tokens), '([\w\s]+)')],
|
||||||
|
$routeUri
|
||||||
|
) . '$/';
|
||||||
|
|
||||||
|
$result = preg_match($matchingRegex, $requestUri, $matches);
|
||||||
|
if ($result === 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
$matches = array_slice($matches, 1);
|
||||||
|
|
||||||
|
return array_combine(array_map(fn($token) => trim($token, '{}'), $tokens), $matches);
|
||||||
|
}
|
||||||
|
|
||||||
private function autowire(RouteConfig $route): array
|
private function autowire(RouteConfig $route): array
|
||||||
{
|
{
|
||||||
$reflectionMethod = new ReflectionMethod($route->getController(), $route->getMethod());
|
$reflectionMethod = new ReflectionMethod($route->getController(), $route->getMethod());
|
||||||
|
Loading…
Reference in New Issue
Block a user