function RouteProvider::getCandidateOutlines

Same name in this branch
  1. 10 core/tests/Drupal/KernelTests/RouteProvider.php \Drupal\KernelTests\RouteProvider::getCandidateOutlines()
Same name in other branches
  1. 9 core/tests/Drupal/KernelTests/RouteProvider.php \Drupal\KernelTests\RouteProvider::getCandidateOutlines()
  2. 9 core/lib/Drupal/Core/Routing/RouteProvider.php \Drupal\Core\Routing\RouteProvider::getCandidateOutlines()
  3. 8.9.x core/tests/Drupal/KernelTests/RouteProvider.php \Drupal\KernelTests\RouteProvider::getCandidateOutlines()
  4. 8.9.x core/lib/Drupal/Core/Routing/RouteProvider.php \Drupal\Core\Routing\RouteProvider::getCandidateOutlines()
  5. 11.x core/tests/Drupal/KernelTests/RouteProvider.php \Drupal\KernelTests\RouteProvider::getCandidateOutlines()
  6. 11.x core/lib/Drupal/Core/Routing/RouteProvider.php \Drupal\Core\Routing\RouteProvider::getCandidateOutlines()

Returns an array of path pattern outlines that could match the path parts.

Parameters

array $parts: The parts of the path for which we want candidates.

Return value

array An array of outlines that could match the specified path parts.

1 call to RouteProvider::getCandidateOutlines()
RouteProvider::getRoutesByPath in core/lib/Drupal/Core/Routing/RouteProvider.php
Get all routes which match a certain pattern.
1 method overrides RouteProvider::getCandidateOutlines()
TestRouteProvider::getCandidateOutlines in core/tests/Drupal/KernelTests/Core/Routing/RouteProviderTest.php
Returns an array of path pattern outlines that could match the path parts.

File

core/lib/Drupal/Core/Routing/RouteProvider.php, line 271

Class

RouteProvider
A Route Provider front-end for all Drupal-stored routes.

Namespace

Drupal\Core\Routing

Code

protected function getCandidateOutlines(array $parts) {
    $number_parts = count($parts);
    $ancestors = [];
    $length = $number_parts - 1;
    $end = (1 << $number_parts) - 1;
    // The highest possible mask is a 1 bit for every part of the path. We will
    // check every value down from there to generate a possible outline.
    if ($number_parts == 1) {
        $masks = [
            1,
        ];
    }
    elseif ($number_parts <= 3 && $number_parts > 0) {
        // Optimization - don't query the state system for short paths. This also
        // insulates against the state entry for masks going missing for common
        // user-facing paths since we generate all values without checking state.
        $masks = range($end, 1);
    }
    elseif ($number_parts <= 0) {
        // No path can match, short-circuit the process.
        $masks = [];
    }
    else {
        // Get the actual patterns that exist out of state.
        $masks = (array) $this->state
            ->get('routing.menu_masks.' . $this->tableName, []);
    }
    // Only examine patterns that actually exist as router items (the masks).
    foreach ($masks as $i) {
        if ($i > $end) {
            // Only look at masks that are not longer than the path of interest.
            continue;
        }
        elseif ($i < 1 << $length) {
            // We have exhausted the masks of a given length, so decrease the length.
            --$length;
        }
        $current = '';
        for ($j = $length; $j >= 0; $j--) {
            // Check the bit on the $j offset.
            if ($i & 1 << $j) {
                // Bit one means the original value.
                $current .= $parts[$length - $j];
            }
            else {
                // Bit zero means wildcard.
                $current .= '%';
            }
            // Unless we are at offset 0, add a slash.
            if ($j) {
                $current .= '/';
            }
        }
        $ancestors[] = '/' . $current;
    }
    return $ancestors;
}

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