diff --git a/core/lib/Routing/Router.php b/core/lib/Routing/Router.php index 227943e..b778465 100644 --- a/core/lib/Routing/Router.php +++ b/core/lib/Routing/Router.php @@ -4,6 +4,7 @@ namespace KTXC\Routing; use DI\Attribute\Inject; use KTXC\Http\Request\Request; +use KTXC\Http\Request\RequestInputParameters; use KTXC\Http\Response\Response; use KTXC\Injection\Container; use KTXC\Module\ModuleManager; @@ -207,7 +208,8 @@ class Router /** * Dispatch a matched route meta and return a Response (or null if controller does not return one). - * Performs light argument resolution: Request object, route params, body fields, full body for array params. + * Performs light argument resolution: Request object, route params, body fields, query params, full body for array params. + * Precedence on name collision: route params > body fields > query params > parameter default. */ public function dispatch(Route $route, Request $request): ?Response { @@ -224,7 +226,8 @@ class Router try { $requestParameters = $request->getPayload(); } catch (\Throwable) { - // ignore payload errors + // ignore payload errors, fall back to an empty parameter bag + $requestParameters = new RequestInputParameters([]); } $reflectionMethod = new \ReflectionMethod($routeControllerName, $routeControllerMethod); $routeParams = $route->params ?? []; @@ -258,6 +261,11 @@ class Router $callArgs[] = $requestParameters->get($reflectionParameterName); continue; } + // if method parameter matches a query string param, use that + if ($request->query->has($reflectionParameterName)) { + $callArgs[] = $request->query->get($reflectionParameterName); + continue; + } // if method parameter did not match, but has a default value, use that if ($reflectionParameter->isDefaultValueAvailable()) { $callArgs[] = $reflectionParameter->getDefaultValue();