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. 10 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.