function LinksetController::process

Same name and namespace in other branches
  1. 11.x core/modules/system/src/Controller/LinksetController.php \Drupal\system\Controller\LinksetController::process()

Serve linkset requests.

Parameters

\Symfony\Component\HttpFoundation\Request $request: An HTTP request.

\Drupal\system\MenuInterface $menu: A menu for which to produce a linkset.

Return value

\Drupal\Core\Cache\CacheableJsonResponse A linkset response.

File

core/modules/system/src/Controller/LinksetController.php, line 54

Class

LinksetController
Linkset controller.

Namespace

Drupal\system\Controller

Code

public function process(Request $request, MenuInterface $menu) {
    // Load the given menu's tree of elements.
    $tree = $this->loadMenuTree($menu);
    // Get the incoming request URI and parse it so the linkset can use a
    // relative URL for the linkset anchor.
    [
        'path' => $path,
        'query' => $query,
    ] = parse_url($request->getUri()) + [
        'query' => FALSE,
    ];
    // Construct a relative URL.
    $anchor = $path . (!empty($query) ? '?' . $query : '');
    $cacheability = CacheableMetadata::createFromObject($menu);
    // Encode the menu tree as links in the application/linkset+json media type
    // and add the machine name of the menu to which they belong.
    $menu_id = $menu->id();
    $links = $this->toLinkTargetObjects($tree, $cacheability);
    foreach ($links as $rel => $target_objects) {
        $links[$rel] = array_map(function (array $target) use ($menu_id) {
            // According to the Linkset specification, this member must be an array
            // since the "machine-name" target attribute is non-standard.
            // See https://tools.ietf.org/html/draft-ietf-httpapi-linkset-08#section-4.2.4.3
            return $target + [
                'machine-name' => [
                    $menu_id,
                ],
            ];
        }, $target_objects);
    }
    $linkset = !empty($tree) ? [
        [
            'anchor' => $anchor,
        ] + $links,
    ] : [];
    $data = [
        'linkset' => $linkset,
    ];
    // Set the response content-type header.
    $headers = [
        'content-type' => 'application/linkset+json',
    ];
    $response = new CacheableJsonResponse($data, 200, $headers);
    // Attach cacheability metadata to the response.
    $response->addCacheableDependency($cacheability);
    return $response;
}

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