/**
  * 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);
     }
 }
Exemplo n.º 3
0
 /**
  * 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());
     }
 }