function ViewExecutable::getUrl

Same name in other branches
  1. 9 core/modules/views/src/ViewExecutable.php \Drupal\views\ViewExecutable::getUrl()
  2. 8.9.x core/modules/views/src/ViewExecutable.php \Drupal\views\ViewExecutable::getUrl()
  3. 11.x core/modules/views/src/ViewExecutable.php \Drupal\views\ViewExecutable::getUrl()

Gets the URL for the current view.

This URL will be adjusted for arguments.

Parameters

array $args: (optional) Passed in arguments.

string $display_id: (optional) Specify the display ID to link to, fallback to the current ID.

Return value

\Drupal\Core\Url The URL of the current view.

Throws

\InvalidArgumentException Thrown when the current view doesn't have a route available.

File

core/modules/views/src/ViewExecutable.php, line 1991

Class

ViewExecutable
Represents a view as a whole.

Namespace

Drupal\views

Code

public function getUrl($args = NULL, $display_id = NULL) {
    if (!empty($this->override_url)) {
        return $this->override_url;
    }
    $display_handler = $this->displayHandlers
        ->get($display_id ?: $this->current_display)
        ->getRoutedDisplay();
    if (!$display_handler instanceof DisplayRouterInterface) {
        throw new \InvalidArgumentException('You cannot create a URL to a display without routes.');
    }
    if (!isset($args)) {
        $args = $this->args;
    }
    $path = $this->getPath();
    // Don't bother working if there's nothing to do:
    if (empty($path) || empty($args) && !str_contains($path, '%')) {
        return $display_handler->getUrlInfo();
    }
    $argument_keys = isset($this->argument) ? array_keys($this->argument) : [];
    $id = current($argument_keys);
    
    /** @var \Drupal\Core\Url $url */
    $url = $display_handler->getUrlInfo();
    $route = $this->routeProvider
        ->getRouteByName($url->getRouteName());
    $variables = $route->compile()
        ->getVariables();
    $parameters = $url->getRouteParameters();
    foreach ($variables as $variable_name) {
        if (empty($args)) {
            // Try to never put % in a URL; use the wildcard instead.
            if ($id && !empty($this->argument[$id]->options['exception']['value'])) {
                $parameters[$variable_name] = $this->argument[$id]->options['exception']['value'];
            }
            else {
                // Provide some fallback in case no exception value could be found.
                $parameters[$variable_name] = '*';
            }
        }
        else {
            $parameters[$variable_name] = array_shift($args);
        }
        if ($id) {
            $id = next($argument_keys);
        }
    }
    $url->setRouteParameters($parameters);
    return $url;
}

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