You are here

protected function ResourceRoutes::getRoutesForResourceConfig in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/rest/src/Routing/ResourceRoutes.php \Drupal\rest\Routing\ResourceRoutes::getRoutesForResourceConfig()

Provides all routes for a given REST resource config.

This method determines where a resource is reachable, what path replacements are used, the required HTTP method for the operation etc.

Parameters

\Drupal\rest\RestResourceConfigInterface $rest_resource_config: The rest resource config.

Return value

\Symfony\Component\Routing\RouteCollection The route collection.

1 call to ResourceRoutes::getRoutesForResourceConfig()
ResourceRoutes::onDynamicRouteEvent in core/modules/rest/src/Routing/ResourceRoutes.php
Alters existing routes for a specific collection.

File

core/modules/rest/src/Routing/ResourceRoutes.php, line 88

Class

ResourceRoutes
Subscriber for REST-style routes.

Namespace

Drupal\rest\Routing

Code

protected function getRoutesForResourceConfig(RestResourceConfigInterface $rest_resource_config) {
  $plugin = $rest_resource_config
    ->getResourcePlugin();
  $collection = new RouteCollection();
  foreach ($plugin
    ->routes() as $name => $route) {

    /** @var \Symfony\Component\Routing\Route $route */

    // @todo: Are multiple methods possible here?
    $methods = $route
      ->getMethods();

    // Only expose routes that have an explicit method and allow >=1 format
    // for that method.
    if ($methods && ($method = $methods[0]) && $rest_resource_config
      ->getFormats($method)) {
      $route
        ->setRequirement('_csrf_request_header_token', 'TRUE');

      // Check that authentication providers are defined.
      if (empty($rest_resource_config
        ->getAuthenticationProviders($method))) {
        $this->logger
          ->error('At least one authentication provider must be defined for resource @id', [
          '@id' => $rest_resource_config
            ->id(),
        ]);
        continue;
      }

      // Check that formats are defined.
      if (empty($rest_resource_config
        ->getFormats($method))) {
        $this->logger
          ->error('At least one format must be defined for resource @id', [
          '@id' => $rest_resource_config
            ->id(),
        ]);
        continue;
      }

      // The configuration has been validated, so we update the route to:
      // - set the allowed response body content types/formats for methods
      //   that may send response bodies (unless hardcoded by the plugin)
      // - set the allowed request body content types/formats for methods that
      //   allow request bodies to be sent (unless hardcoded by the plugin)
      // - set the allowed authentication providers
      if (in_array($method, [
        'GET',
        'HEAD',
        'POST',
        'PUT',
        'PATCH',
      ], TRUE) && !$route
        ->hasRequirement('_format')) {
        $route
          ->addRequirements([
          '_format' => implode('|', $rest_resource_config
            ->getFormats($method)),
        ]);
      }
      if (in_array($method, [
        'POST',
        'PATCH',
        'PUT',
      ], TRUE) && !$route
        ->hasRequirement('_content_type_format')) {
        $route
          ->addRequirements([
          '_content_type_format' => implode('|', $rest_resource_config
            ->getFormats($method)),
        ]);
      }
      $route
        ->setOption('_auth', $rest_resource_config
        ->getAuthenticationProviders($method));
      $route
        ->setDefault('_rest_resource_config', $rest_resource_config
        ->id());
      $parameters = $route
        ->getOption('parameters') ?: [];
      $route
        ->setOption('parameters', $parameters + [
        '_rest_resource_config' => [
          'type' => 'entity:' . $rest_resource_config
            ->getEntityTypeId(),
        ],
      ]);
      $collection
        ->add("rest.{$name}", $route);
    }
  }
  return $collection;
}