/** * @param ActionExecutionContext $context * @return ActionResult */ public final function execute(ActionExecutionContext $context) { $this->currentContext = $context; if (!method_exists($this, $context->action)) { return $this->handleUnknownAction($context); } $method = new ReflectionMethod($this, $context->action); $requestMethod = ReflectionUtil::getRequestMethod($method); if ($requestMethod && strtolower($context->request->requestMethod) !== strtolower($requestMethod)) { //if @request-method annotation exists and does not match the incoming request method, then the action is not a match return $this->handleUnknownAction($context); } $beforeFilters = $this->getActionFilters($method, 'before'); foreach ($beforeFilters as $filter) { $filter->execute($context); } $refParams = $method->getParameters(); //create parameters for action, i.e. model binding if (count($refParams) > 0) { $params = array(); $requestValues = array_merge($context->routeMatch->getData(), $context->request->queryString->toArray(), $context->request->post->toArray()); foreach ($refParams as $param) { $type = ReflectionUtil::getParameterType($param); $params[$param->getPosition()] = $context->modelBinders->getBinderOrDefault($type)->bindModel(new BindingContext($requestValues, $context, $param->getName(), $type)); } return $method->invokeArgs($this, $params); } $executedContext = new ActionExecutedContext($context, $method->invoke($this), $method); $afterFilters = $this->getActionFilters($method, 'after'); foreach ($afterFilters as $filter) { $filter->execute($executedContext); } return $executedContext->actionResult; }
public function testDetectTypeHintedParameterTypes() { $params = $this->class->getMethod('foo')->getParameters(); self::assertEquals('ReflectionClass', ReflectionUtil::getParameterType($params[3])); }