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:
Tim 2023-08-09 18:17:34 +02:00
parent 6f247f3ab7
commit 2fd6e50b90

View File

@ -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());