/** * Add rel=schema Link header for most routes * * This does not add a link to routes used by the schema bundle * itself. * * @param FilterResponseEvent $event response event * * @return void */ public function onKernelResponse(FilterResponseEvent $event) { $request = $event->getRequest(); $response = $event->getResponse(); $type = $response->headers->get('Content-Type'); if ($type !== null && substr(strtolower($type), 0, 16) !== 'application/json') { return; } // build content-type string $contentType = 'application/json; charset=UTF-8'; if ($request->get('_route') != 'graviton.core.static.main.all') { try { $schemaRoute = SchemaUtils::getSchemaRouteName($request->get('_route')); $contentType .= sprintf('; profile=%s', $this->router->generate($schemaRoute, array(), true)); } catch (\Exception $e) { return true; } } // replace content-type if a schema was requested if ($request->attributes->get('schemaRequest')) { $contentType = 'application/schema+json'; } $response->headers->set('Content-Type', $contentType); $event->setResponse($response); }
/** * add a rel=self Link header to the response * * @param FilterResponseEvent $event response listener event * * @return void */ public function onKernelResponse(FilterResponseEvent $event) { $request = $event->getRequest(); if ($request->attributes->get('schemaRequest', false)) { $response = $event->getResponse(); $linkHeader = LinkHeader::fromResponse($response); $routeName = SchemaUtils::getSchemaRouteName($request->get('_route')); $url = $this->router->generate($routeName, array(), true); // append rel=canonical link to link headers $linkHeader->add(new LinkHeaderItem($url, array('rel' => 'canonical'))); // overwrite link headers with new headers $response->headers->set('Link', (string) $linkHeader); $event->setResponse($response); } }