/** * @param Action $action * @param Request $request * @return array * @throws \Exception */ protected function _extractActionParameters(Action $action, Request $request) { $reflectionMethod = new \ReflectionMethod($action->getControllerName(), $action->getMethodName()); $parameters = []; foreach ($reflectionMethod->getParameters() as $parameter) { $parameterClass = $parameter->getClass(); if ($parameterClass) { if (is_a($parameterClass->getName(), '\\Wrestler\\Http\\Request\\RouteParams', true)) { $parameters[] = $parameterClass->newInstance($action->getRouteParams()); continue; } if (is_a($parameterClass->getName(), '\\Wrestler\\Http\\Request\\PostData', true)) { $parameters[] = $parameterClass->newInstance($request->getPostData()); continue; } if (is_a($parameterClass->getName(), '\\Wrestler\\Http\\Request\\Query', true)) { $parameters[] = $parameterClass->newInstance($request->getQuery()); continue; } if (is_a($parameterClass->getName(), '\\Wrestler\\Http\\Request\\Headers', true)) { $parameters[] = $parameterClass->newInstance($request->getHeaders()); continue; } } $variable = $parameter->getName(); if ($parameterClass) { $variable = $parameterClass->getName() . ' ' . $variable; } throw new \Exception("Cannot map `{$variable}`"); } return $parameters; }
/** * @param Request $request * @return Action|null */ public function findAction(Request $request) { $context = new RequestContext(); $context->fromRequest($request->getInternalRequest()); $matcher = new UrlMatcher($this->_routes, $context); try { $params = $matcher->matchRequest($request->getInternalRequest()); } catch (\RuntimeException $exception) { return null; } $controllerName = $params['_controllerName']; $methodName = $params['_methodName']; unset($params['_controllerName']); unset($params['_methodName']); unset($params['_route']); return new Action($controllerName, $methodName, $params); }