function ReadOnlyModeMethodFilter::filter

Same name in other branches
  1. 9 core/modules/jsonapi/src/Routing/ReadOnlyModeMethodFilter.php \Drupal\jsonapi\Routing\ReadOnlyModeMethodFilter::filter()
  2. 8.9.x core/modules/jsonapi/src/Routing/ReadOnlyModeMethodFilter.php \Drupal\jsonapi\Routing\ReadOnlyModeMethodFilter::filter()
  3. 11.x core/modules/jsonapi/src/Routing/ReadOnlyModeMethodFilter.php \Drupal\jsonapi\Routing\ReadOnlyModeMethodFilter::filter()

Overrides FilterInterface::filter

File

core/modules/jsonapi/src/Routing/ReadOnlyModeMethodFilter.php, line 47

Class

ReadOnlyModeMethodFilter
Filters routes based on the HTTP method and JSON:API's read-only mode.

Namespace

Drupal\jsonapi\Routing

Code

public function filter(RouteCollection $collection, Request $request) {
    $all_supported_methods = [];
    foreach ($collection->all() as $name => $route) {
        $all_supported_methods[] = $route->getMethods();
    }
    $all_supported_methods = array_merge(...$all_supported_methods);
    $collection = $this->inner
        ->filter($collection, $request);
    if (!$this->readOnlyModeIsEnabled) {
        return $collection;
    }
    $read_only_methods = [
        'GET',
        'HEAD',
        'OPTIONS',
        'TRACE',
    ];
    foreach ($collection->all() as $name => $route) {
        if (!$route->hasDefault(Routes::JSON_API_ROUTE_FLAG_KEY)) {
            continue;
        }
        $supported_methods = $route->getMethods();
        assert(count($supported_methods) > 0, 'JSON:API routes always have a method specified.');
        $is_read_only_route = empty(array_diff($supported_methods, $read_only_methods));
        if (!$is_read_only_route) {
            $collection->remove($name);
        }
    }
    if (count($collection)) {
        return $collection;
    }
    throw new MethodNotAllowedHttpException(array_intersect($all_supported_methods, $read_only_methods), sprintf("JSON:API is configured to accept only read operations. Site administrators can configure this at %s.", Url::fromRoute('jsonapi.settings')->setAbsolute()
        ->toString(TRUE)
        ->getGeneratedUrl()));
}

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