function Routes::getIndividualRoutesForResourceType

Same name and namespace in other branches
  1. 9 core/modules/jsonapi/src/Routing/Routes.php \Drupal\jsonapi\Routing\Routes::getIndividualRoutesForResourceType()
  2. 8.9.x core/modules/jsonapi/src/Routing/Routes.php \Drupal\jsonapi\Routing\Routes::getIndividualRoutesForResourceType()
  3. 10 core/modules/jsonapi/src/Routing/Routes.php \Drupal\jsonapi\Routing\Routes::getIndividualRoutesForResourceType()

Gets a route collection for the given resource type.

Parameters

\Drupal\jsonapi\ResourceType\ResourceType $resource_type: The resource type for which the route collection should be created.

Return value

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

1 call to Routes::getIndividualRoutesForResourceType()
Routes::getRoutesForResourceType in core/modules/jsonapi/src/Routing/Routes.php
Gets applicable resource routes for a JSON:API resource type.

File

core/modules/jsonapi/src/Routing/Routes.php, line 280

Class

Routes
Defines dynamic routes.

Namespace

Drupal\jsonapi\Routing

Code

protected static function getIndividualRoutesForResourceType(ResourceType $resource_type) {
    if (!$resource_type->isLocatable()) {
        return new RouteCollection();
    }
    $routes = new RouteCollection();
    $path = $resource_type->getPath();
    $entity_type_id = $resource_type->getEntityTypeId();
    // Individual read, update and remove.
    $individual_route = new Route("/{$path}/{entity}");
    $individual_route->addDefaults([
        RouteObjectInterface::CONTROLLER_NAME => static::CONTROLLER_SERVICE_NAME . ':getIndividual',
    ]);
    $individual_route->setMethods([
        'GET',
    ]);
    // No _entity_access requirement because "view" and "view label" access are
    // checked in the controller. So it's safe to allow anybody access.
    $individual_route->setRequirement('_access', 'TRUE');
    $routes->add(static::getRouteName($resource_type, 'individual'), $individual_route);
    if ($resource_type->isMutable()) {
        $individual_update_route = new Route($individual_route->getPath());
        $individual_update_route->addDefaults([
            RouteObjectInterface::CONTROLLER_NAME => static::CONTROLLER_SERVICE_NAME . ':patchIndividual',
        ]);
        $individual_update_route->setMethods([
            'PATCH',
        ]);
        $individual_update_route->setRequirement('_entity_access', "entity.update");
        $individual_update_route->setRequirement('_csrf_request_header_token', 'TRUE');
        $routes->add(static::getRouteName($resource_type, 'individual.patch'), $individual_update_route);
        $individual_remove_route = new Route($individual_route->getPath());
        $individual_remove_route->addDefaults([
            RouteObjectInterface::CONTROLLER_NAME => static::CONTROLLER_SERVICE_NAME . ':deleteIndividual',
        ]);
        $individual_remove_route->setMethods([
            'DELETE',
        ]);
        $individual_remove_route->setRequirement('_entity_access', "entity.delete");
        $individual_remove_route->setRequirement('_csrf_request_header_token', 'TRUE');
        $routes->add(static::getRouteName($resource_type, 'individual.delete'), $individual_remove_route);
    }
    foreach ($resource_type->getRelatableResourceTypes() as $relationship_field_name => $target_resource_types) {
        // Read, update, add, or remove an individual resources relationships to
        // other resources.
        $relationship_route = new Route("/{$path}/{entity}/relationships/{$relationship_field_name}");
        $relationship_route->addDefaults([
            '_on_relationship' => TRUE,
        ]);
        $relationship_route->addDefaults([
            'related' => $relationship_field_name,
        ]);
        $relationship_route->setRequirement('_csrf_request_header_token', 'TRUE');
        $relationship_route_methods = $resource_type->isMutable() ? [
            'GET',
            'POST',
            'PATCH',
            'DELETE',
        ] : [
            'GET',
        ];
        $relationship_controller_methods = [
            'GET' => 'getRelationship',
            'POST' => 'addToRelationshipData',
            'PATCH' => 'replaceRelationshipData',
            'DELETE' => 'removeFromRelationshipData',
        ];
        foreach ($relationship_route_methods as $method) {
            $method_specific_relationship_route = clone $relationship_route;
            $field_operation = $method === 'GET' ? 'view' : 'edit';
            $method_specific_relationship_route->setRequirement(RelationshipRouteAccessCheck::ROUTE_REQUIREMENT_KEY, "{$relationship_field_name}.{$field_operation}");
            $method_specific_relationship_route->addDefaults([
                RouteObjectInterface::CONTROLLER_NAME => static::CONTROLLER_SERVICE_NAME . ":{$relationship_controller_methods[$method]}",
            ]);
            $method_specific_relationship_route->setMethods($method);
            $routes->add(static::getRouteName($resource_type, sprintf("%s.relationship.%s", $relationship_field_name, strtolower($method))), $method_specific_relationship_route);
        }
        // Only create routes for related routes that target at least one
        // non-internal resource type.
        if (static::hasNonInternalTargetResourceTypes($target_resource_types)) {
            // Get an individual resource's related resources.
            $related_route = new Route("/{$path}/{entity}/{$relationship_field_name}");
            $related_route->setMethods([
                'GET',
            ]);
            $related_route->addDefaults([
                RouteObjectInterface::CONTROLLER_NAME => static::CONTROLLER_SERVICE_NAME . ':getRelated',
            ]);
            $related_route->addDefaults([
                'related' => $relationship_field_name,
            ]);
            $related_route->setRequirement(RelationshipRouteAccessCheck::ROUTE_REQUIREMENT_KEY, "{$relationship_field_name}.view");
            $routes->add(static::getRouteName($resource_type, "{$relationship_field_name}.related"), $related_route);
        }
    }
    // Add entity parameter conversion to every route.
    $routes->addOptions([
        'parameters' => [
            'entity' => [
                'type' => 'entity:' . $entity_type_id,
            ],
        ],
    ]);
    return $routes;
}

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