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