Как получить текущий псевдоним пути или путь?

56

Как я могу получить текущий псевдоним и / или путь в Drupal 8?

В Drupal 7 я сделал это с drupal_get_path_alias(). Какой эквивалентный код я должен использовать в Drupal 8?

Юсеф
источник

Ответы:

108

Некоторые из других ответов были правильными только в предыдущих альфа / бета-версиях Drupal 8 или казались неполными. Начиная с бета7 (и, надеюсь, навсегда), должны применяться следующие правила:

Для текущего необработанного пути (необъявленный путь Drupal):

$current_path = \Drupal::service('path.current')->getPath()

Для текущего URI , который в значительной степени является прямым представлением запроса (он может даже включать строку запроса):

$current_uri = \Drupal::request()->getRequestUri();

Конечно, нет никакой гарантии, что это $current_uriзначение даст вам псевдоним, даже если он доступен для запроса, поскольку он представляет только то, что запросил пользователь. Поэтому, чтобы строго выполнить то, о чем вы просите (получить псевдоним, если он доступен, и путь, если нет), я думаю, вы могли бы сделать:

$current_path = \Drupal::service('path.current')->getPath();
$result = \Drupal::service('path.alias_manager')->getAliasByPath($current_path);

Конечно, в зависимости от типа обработки, которую вы выполняете, лучше всего работать с маршрутами, а не с путями, но я полагаю, что это совсем другая тема.

rjacobs
источник
почему вы упоминаете, что было бы лучше использовать маршруты вместо путей? Можете ли вы привести краткий пример / причину?
itdarrylnorris
@ darol100, я, возможно, не лучший человек, чтобы дать исчерпывающий ответ на этот вопрос, но я могу вам сказать, что использование путей для программной генерации URL официально запрещено в Drupal 8 - см. drupal.org/node/2046643 . Маршруты Symfony предоставляют более надежный способ сопоставления ресурсов независимо от структур путей (если вы создаете ссылку, используя маршруты, эта ссылка будет продолжать работать, даже если путь / шаблон URL-адреса изменится).
rjacobs
Просто примечание, ::getAliasByPath()которое больше не будет принимать строку пути без косой черты (начиная с бета13, я полагаю).
машины
5
getAliasByPathвозвращает путь без языкового префикса. Есть идеи, как это решить?
Филипп Майкл
1
как насчет шаблона веточки?
Ешьте
35

Правильный способ для URL без псевдонима URL.

$current_path = \Drupal::service('path.current')->getPath()
Дэниел Венер
источник
Уважает ли \Drupal::request()->getRequestUri();Drupal установку в подпапку?
Брайан
Как бы я сделал это для не текущего пути? Есть ли способ получить его из строки?
BrandenB171
Как мне получить абсолютный путь, такой как этот: mydrupalsite.org/node/123 ?
mcaleaa
1
global $ base_root; $ current_uri = \ Drupal :: request () -> getRequestUri (); $ current_path = $ base_root. $ current_uri;
oknate
18

В Drupal 8 вы можете сделать это с помощью Twig:

{{ url('<current>') }}

пример:

<a href="{{ url('<current>') }}">{{ 'Reload'|t }}</a>

от: https://www.drupal.org/docs/8/theming/twig/functions-in-twig-templates

Никола Де Лаззари
источник
1
Отличная находка @ nicola-de-lazzari - Ваши ответы также работают и в Views. «Просмотр»> «Поля»> «Переписать результаты»> «Путь к ссылке» принимает, {{ url('<current>') }}даже если он не указан в разделе «Шаблоны замены».
Пит
16

Для получения текущего пути в Drupal 7 вы используете для использования current_path(), но в Drupal 8 вы используете $url = Url::fromRoute('<current>');.

Источник: https://www.drupal.org/node/2382211

Нитеш Сетия
источник
current_path()и drupal_get_path_alias()они разные функции.
itdarrylnorris
Это должен быть ответ, так как эта версия дает путь с префиксом языка.
Гийом Буа
ОП запрашивает эквивалент D8 для drupal_get_path_alias (). Вы возвращаете текущий путь, а НЕ псевдоним из D7 'node /' .$ nid
macjules
9

Чтобы получить текущий путь (aliased path):

// Returns something like /about
$url = \Drupal\Core\Url::fromRoute('<current>');

Чтобы получить текущий путь (системный путь):

// Returns node/1
$path = $url->getInternalPath();
Рахул Байсане
источник
7

Для Drupal 8 это самое чистое решение, которое мне удалось найти:

Url::fromRoute('<current>',array(),array('absolute'=>'true'));
crobicha
источник
5
\Drupal\Core\Url::fromRoute('<current>', [], ['absolute' => 'true'])->toString()
Leymannx
2

Если вам нужен абсолютный URL с строкой запроса:

use Drupal\Core\Url;
// ...
Url::fromRoute('<current>', [], ['query' => \Drupal::request()->query->all(), 'absolute' => 'true'])->toString();
Дэвид Томас
источник