Як отримати поточний псевдонім або шлях?


Відповіді:


108

Деякі з інших відповідей були правильними лише під час попередніх альфа-бета-версій Drupal 8 або здавалися неповними. Щодо бета7 (і, сподіваємось, постійно), слід застосовувати такі правила:

Для поточного неочищеного шляху (нежилого Друпальського шляху):

$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);

Звичайно, залежно від типу обробки, яку ви виконуєте, можливо, найкраще працювати з маршрутами замість шляхів, але я вважаю, що це зовсім інша тема.


чому ви згадуєте, що краще було б використовувати маршрути замість стежок? Чи можете ви навести короткий приклад / причину?
itsdarrylnorris

@ 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
глобальний $ base_root; $ current_uri = \ Drupal :: request () -> getRequestUri (); $ current_path = $ base_root. $ current_uri;
окнат

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 - Також Ваші відповіді працюють і в Переглядах. Перегляд> Поля> Перезаписати результати> Шлях посилання приймає, {{ 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()вони різні функції.
itsdarrylnorris

Це має бути відповіддю, оскільки ця версія дає шлях з мовним префіксом.
Гійом Буа

ОП просить еквівалент D8 для drupal_get_path_alias (). Ви повертаєте поточний шлях, а НЕ зведений шлях від вузла D7 '/'.$ nid
macjules

9

Щоб отримати поточний шлях (псевдонім):

// 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'));

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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.