function ResourceResponseSubscriber::getResponseFormat

Same name and namespace in other branches
  1. 9 core/modules/rest/src/EventSubscriber/ResourceResponseSubscriber.php \Drupal\rest\EventSubscriber\ResourceResponseSubscriber::getResponseFormat()
  2. 8.9.x core/modules/rest/src/EventSubscriber/ResourceResponseSubscriber.php \Drupal\rest\EventSubscriber\ResourceResponseSubscriber::getResponseFormat()
  3. 11.x core/modules/rest/src/EventSubscriber/ResourceResponseSubscriber.php \Drupal\rest\EventSubscriber\ResourceResponseSubscriber::getResponseFormat()

Determines the format to respond in.

Respects the requested format if one is specified. However, it is common to forget to specify a response format in case of a POST or PATCH. Rather than simply throwing an error, we apply the robustness principle: when POSTing or PATCHing using a certain format, you probably expect a response in that same format.

Parameters

\Drupal\Core\Routing\RouteMatchInterface $route_match: The current route match.

\Symfony\Component\HttpFoundation\Request $request: The current request.

Return value

string The response format.

1 call to ResourceResponseSubscriber::getResponseFormat()
ResourceResponseSubscriber::onResponse in core/modules/rest/src/EventSubscriber/ResourceResponseSubscriber.php
Serializes ResourceResponse responses' data, and removes that data.

File

core/modules/rest/src/EventSubscriber/ResourceResponseSubscriber.php, line 96

Class

ResourceResponseSubscriber
Response subscriber that serializes and removes ResourceResponses' data.

Namespace

Drupal\rest\EventSubscriber

Code

public function getResponseFormat(RouteMatchInterface $route_match, Request $request) {
  $route = $route_match->getRouteObject();
  $acceptable_response_formats = $route->hasRequirement('_format') ? explode('|', $route->getRequirement('_format')) : [];
  $acceptable_request_formats = $route->hasRequirement('_content_type_format') ? explode('|', $route->getRequirement('_content_type_format')) : [];
  $acceptable_formats = $request->isMethodCacheable() ? $acceptable_response_formats : $acceptable_request_formats;
  $requested_format = $request->getRequestFormat();
  $content_type_format = $request->getContentTypeFormat();
  // If an acceptable response format is requested, then use that. Otherwise,
  // including and particularly when the client forgot to specify a response
  // format, then use heuristics to select the format that is most likely
  // expected.
  if (in_array($requested_format, $acceptable_response_formats, TRUE)) {
    return $requested_format;
  }
  // If a request body is present, then use the format corresponding to the
  // request body's Content-Type for the response, if it's an acceptable
  // format for the request.
  if (!empty($request->getContent()) && in_array($content_type_format, $acceptable_request_formats, TRUE)) {
    return $content_type_format;
  }
  // Otherwise, use the first acceptable format.
  if (!empty($acceptable_formats)) {
    return $acceptable_formats[0];
  }
  // Sometimes, there are no acceptable formats.
  return NULL;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.