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:
		| @@ -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()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user