/** * Renders the parameters and template and initializes a new response object with the * rendered content. * * @param GetResponseForControllerResultEvent $event * @return array|mixed */ public function onKernelView(GetResponseForControllerResultEvent $event) { $request = $event->getRequest(); $configuration = $request->attributes->get('_view'); $view = $event->getControllerResult(); if (!$view instanceof View) { if (!$configuration && !$this->container->getParameter('fos_rest.view_response_listener.force_view')) { return parent::onKernelView($event); } $view = new View($view); } if ($configuration) { if ($configuration->getTemplateVar()) { $view->setTemplateVar($configuration->getTemplateVar()); } if (null === $view->getStatusCode() && $configuration->getStatusCode()) { $view->setStatusCode($configuration->getStatusCode()); } if ($configuration->getSerializerGroups()) { $context = $view->getSerializationContext() ?: new SerializationContext(); $context->setGroups($configuration->getSerializerGroups()); $view->setSerializationContext($context); } } if (null === $view->getFormat()) { $view->setFormat($request->getRequestFormat()); } $vars = $request->attributes->get('_template_vars'); if (!$vars) { $vars = $request->attributes->get('_template_default_vars'); } $viewHandler = $this->container->get('fos_rest.view_handler'); if ($viewHandler->isFormatTemplating($view->getFormat())) { if (!empty($vars)) { $parameters = (array) $viewHandler->prepareTemplateParameters($view); foreach ($vars as $var) { if (!array_key_exists($var, $parameters)) { $parameters[$var] = $request->attributes->get($var); } } $view->setData($parameters); } $template = $request->attributes->get('_template'); if ($template) { if ($template instanceof TemplateReference) { $template->set('format', null); } $view->setTemplate($template); } } $response = $viewHandler->handle($view, $request); $event->setResponse($response); }
/** * Handles a request with the proper handler * * Decides on which handler to use based on the request format * * @param View $view * @param Request $request Request object * * @return Response */ public function handle($view, Request $request = null) { if (null === $request) { $request = $this->container->get('request'); } $format = $view->getFormat() ?: $request->getRequestFormat(); if (!$this->supports($format)) { $msg = "Format '{$format}' not supported, handler must be implemented"; throw new HttpException(Codes::HTTP_UNSUPPORTED_MEDIA_TYPE, $msg); } if (isset($this->customHandlers[$format])) { return call_user_func($this->customHandlers[$format], $this, $view, $request, $format); } return $this->createResponse($view, $request, $format); }