/** * This is a listener for KernelEvents::VIEW which will render a view or send JSON depending on the Accept header * * @param GetResponseForControllerResultEvent $event * * @throws SCTException * @throws \Exception */ public function render(GetResponseForControllerResultEvent $event) { /** @var Response|array $result */ $result = $event->getControllerResult(); //if we have a response then just set that and return if ($result instanceof Response) { $event->setResponse($result); return; } //otherwise lets render a response $request = $event->getRequest(); $response = new Response(); $acceptableContentType = $request->getAcceptableContentTypes(); if (in_array('text/html', $acceptableContentType)) { $template = $this->controller->getTemplate(); //if we don't have a template throw exception if (!$template) { throw new SCTException("Browser requested html but controller didn't specify a template."); } $defaultData = $this->controller->getDefaultData(); if (is_array($result)) { $defaultData = array_merge($defaultData, $result); } $response = $this->renderHTML($template, $defaultData); } else { if (in_array('application/json', $acceptableContentType)) { $response = new JsonResponse($result); } } $event->setResponse($response); }