/** * add a rel=self Link header to the response * * @param FilterResponseEvent $event response listener event * * @return void */ public function onKernelResponse(FilterResponseEvent $event) { if (!$event->isMasterRequest()) { // don't do anything if it's not the master request return; } $response = $event->getResponse(); $request = $event->getRequest(); $linkHeader = LinkHeader::fromResponse($response); // extract various info from route $routeName = $request->get('_route'); $routeParts = explode('.', $routeName); $routeType = end($routeParts); if ($routeType == 'post') { $routeName = substr($routeName, 0, -4) . 'get'; } /** if the request failed in the RestController, $request will not have an record id in case of a POST and $router->generate() will fail. that's why we catch it and fail silently by not including our header in the response. i hope that's a good compromise. **/ /** Nope, it's not a good compromise...catch and handle it where it happens. * I will refactory this in another branch*/ $addHeader = true; $url = ''; try { $url = $this->router->generate($routeName, $this->generateParameters($routeType, $request), true); } catch (\Exception $e) { $addHeader = false; } if ($addHeader) { // append rel=self link to link headers $linkHeader->add(new LinkHeaderItem($url, array('rel' => 'self'))); // overwrite link headers with new headers $response->headers->set('Link', (string) $linkHeader); } }
/** * 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); } }
/** * add a rel=self Link header to the response * * @param FilterResponseEvent $event response listener event * @param string $eventName event name * @param EventDispatcherInterface $dispatcher dispatcher * * @return void */ public function onKernelResponse(FilterResponseEvent $event, $eventName, EventDispatcherInterface $dispatcher) { if (!$event->isMasterRequest()) { // don't do anything if it's not the master request return; } $response = $event->getResponse(); $request = $event->getRequest(); $linkHeader = LinkHeader::fromResponse($response); // extract various info from route $routeName = $request->get('_route'); $routeParts = explode('.', $routeName); $routeType = end($routeParts); if ($routeType == 'post') { $routeName = substr($routeName, 0, -4) . 'get'; } if ($routeType == 'postNoSlash') { $routeName = substr($routeName, 0, -11) . 'get'; } /** if the request failed in the RestController, $request will not have an record id in case of a POST and $router->generate() will fail. that's why we catch it and fail silently by not including our header in the response. i hope that's a good compromise. **/ /** Nope, it's not a good compromise...catch and handle it where it happens. * I will refactory this in another branch*/ $addHeader = true; $url = ''; try { $params = $this->generateParameters($routeType, $request); $query = ''; if (array_key_exists('q', $params)) { $query = '?' . strtr($params['q'], [',' => '%2C']); unset($params['q']); } $url = $this->getRqlUrl($request, $this->router->generate($routeName, $params, true) . $query); } catch (\Exception $e) { $addHeader = false; } if ($addHeader) { // append rel=self link to link headers $linkHeader->add(new LinkHeaderItem($url, array('rel' => 'self'))); // overwrite link headers with new headers $response->headers->set('Link', (string) $linkHeader); // set in request and dispatch new event for interested parties $event->getRequest()->attributes->set('selfLink', $url); $dispatcher->dispatch('graviton.rest.response.selfaware', $event); } }
/** * add a rel=self Link header to the response * * @param FilterResponseEvent $event response listener event * * @return void */ public function onKernelResponse(FilterResponseEvent $event) { $response = $event->getResponse(); $request = $event->getRequest(); // extract various info from route $routeName = $request->get('_route'); $routeParts = explode('.', $routeName); $routeType = end($routeParts); // only collections have paging if ($routeType == 'all' && $request->attributes->get('paging')) { $additionalParams = array(); if ($request->attributes->get('filtering')) { $additionalParams['q'] = $request->get('q', ''); } $this->linkHeader = LinkHeader::fromResponse($response); $this->generateLinks($routeName, $request->get('page', 1), $request->attributes->get('numPages'), $request->attributes->get('perPage'), $additionalParams); $response->headers->set('Link', (string) $this->linkHeader); } }
/** * add a rel=self Link header to the response * * @param FilterResponseEvent $event response listener event * * @return void */ public function onKernelResponse(FilterResponseEvent $event) { $response = $event->getResponse(); $request = $event->getRequest(); // extract various info from route $routeName = $request->get('_route'); $routeParts = explode('.', $routeName); $routeType = end($routeParts); // only collections have paging if ($routeType == 'all' && $request->attributes->get('paging')) { $rql = ''; if ($request->attributes->get('hasRql', false)) { $rql = $request->attributes->get('rawRql', ''); } $this->linkHeader = LinkHeader::fromResponse($response); $this->generateLinks($routeName, $request->attributes->get('page'), $request->attributes->get('numPages'), $request->attributes->get('perPage'), $request, $rql); $response->headers->set('Link', (string) $this->linkHeader); $response->headers->set('X-Total-Count', (string) $request->attributes->get('totalCount')); } }
/** * add a rel=eventStatus Link header to the response if necessary * * @param FilterResponseEvent $event response listener event * * @return void */ public function onKernelResponse(FilterResponseEvent $event) { // exit if not master request or uninteresting method.. if (!$event->isMasterRequest() || $this->isNotConcerningRequest()) { return; } // we can always safely call this, it doesn't need much resources. // only if we have subscribers, it will create more load as it persists an EventStatus $queueEvent = $this->createQueueEventObject(); /** @var Response $response */ $response = $event->getResponse(); if (!empty($queueEvent->getStatusurl()) && !empty($queueEvent->getEvent())) { $linkHeader = LinkHeader::fromResponse($response); $linkHeader->add(new LinkHeaderItem($queueEvent->getStatusurl(), array('rel' => 'eventStatus'))); $response->headers->set('Link', (string) $linkHeader); } // let's send it to the queue if appropriate if (!empty($queueEvent->getEvent())) { $this->rabbitMqProducer->publish(json_encode($queueEvent), $queueEvent->getEvent()); } }