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