Jak uzyskać bieżący alias lub ścieżkę?

56

Jak mogę uzyskać bieżący alias i / lub ścieżkę w Drupal 8?

W Drupal 7 zrobiłem to z drupal_get_path_alias(). Jaki kod powinienem zastosować w Drupal 8?

Yusef Mohamadi
źródło

Odpowiedzi:

108

Niektóre inne odpowiedzi były poprawne tylko podczas poprzednich wersji alfa / beta Drupala 8 lub wydawały się niekompletne. Od wersji beta7 (i, mam nadzieję, że na stałe), powinny obowiązywać następujące zasady:

Dla bieżącej surowej ścieżki (niezaaloryzowanej ścieżki Drupala):

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

W przypadku bieżącego identyfikatora URI , który jest prawie bezpośrednią reprezentacją żądania (może nawet zawierać ciąg zapytania):

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

Oczywiście nie ma gwarancji, że ta $current_uriwartość da ci alias, nawet jeśli jest on dostępny dla żądania, ponieważ reprezentuje tylko to, czego zażądał użytkownik. Więc aby ściśle zrobić to, o co prosisz (uzyskaj alias, jeśli jest dostępny, i ścieżkę, jeśli nie). Myślę, że możesz:

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

Oczywiście w zależności od rodzaju wykonywanego przetwarzania najlepiej jest pracować z trasami zamiast ścieżkami, ale przypuszczam, że to zupełnie inny temat.

rjacobs
źródło
dlaczego wspominasz, że lepiej byłoby używać tras zamiast ścieżek? Czy możesz podać krótki przykład / powód?
itsdarrylnorris
@ darol100, może nie jestem najlepszą osobą, która udzieli wyczerpującej odpowiedzi na to pytanie, ale mogę powiedzieć, że korzystanie ze ścieżek do programowego generowania adresów URL jest oficjalnie zaniedbane w Drupal 8 - patrz: drupal.org/node/2046643 . Trasy w Symfony zapewniają bardziej niezawodny sposób mapowania zasobów niezależnie od struktur ścieżek (jeśli zbudujesz łącze za pomocą tras, łącze to będzie działać, nawet jeśli zmieni się ścieżka / wzorzec adresu URL).
rjacobs
Tylko uwaga, ::getAliasByPath()która nie będzie już akceptować ciągu ścieżki bez wiodącego ukośnika (od wersji beta13 wierzę).
othermachines
5
getAliasByPathzwraca ścieżkę bez prefiksu języka. Masz pomysł, jak to rozwiązać?
Philipp Michael
1
co z szablonu gałązki?
Zjedz
35

Właściwy sposób dla adresu URL bez aliasu adresu URL.

$current_path = \Drupal::service('path.current')->getPath()
Daniel Wehner
źródło
Czy \Drupal::request()->getRequestUri();szacunek instaluje Drupal w podfolderze?
Brian
jak mam to zrobić dla ścieżki nieaktualnej? czy istnieje sposób, aby uzyskać go z samego ciągu?
BrandenB171,
Jak uzyskać bezwzględną ścieżkę, taką jak ta: mydrupalsite.org/node/123 ?
mcaleaa,
1
globalny $ base_root; $ current_uri = \ Drupal :: request () -> getRequestUri (); $ current_path = $ base_root. $ current_uri;
oknate
18

W Drupal 8 możesz to zrobić za pomocą Twig:

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

przykład:

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

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

Nicola De Lazzari
źródło
1
Świetne znalezisko @ nicola-de-lazzari - Twoje odpowiedzi działają również w Widoku. Widok> Pola> Przepisz wyniki> Ścieżka łącza akceptuje, {{ url('<current>') }}nawet jeśli nie jest wymieniona w obszarze Wzory zastępowania.
piet
16

Aby uzyskać bieżącą ścieżkę w Drupal 7, używasz current_path(), ale w Drupal 8 używasz $url = Url::fromRoute('<current>');.

Źródło: https://www.drupal.org/node/2382211

Nitesh Sethia
źródło
current_path()i drupal_get_path_alias()są to różne funkcje.
itsdarrylnorris
To powinna być odpowiedź, ponieważ ta wersja zawiera ścieżkę z prefiksem języka.
Guillaume Bois
OP prosi o odpowiednik D8 drupal_get_path_alias (). Zwracasz bieżącą ścieżkę, a NIE ścieżkę aliasu z węzła D7 '/' .$ nid
macjules
9

Aby uzyskać bieżącą ścieżkę (ścieżkę aliasu):

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

Aby uzyskać bieżącą ścieżkę (ścieżkę systemową):

// Returns node/1
$path = $url->getInternalPath();
Rahul Baisane
źródło
7

W przypadku Drupala 8 jest to najczystsze rozwiązanie, jakie udało mi się znaleźć:

Url::fromRoute('<current>',array(),array('absolute'=>'true'));
Crobicha
źródło
5
\Drupal\Core\Url::fromRoute('<current>', [], ['absolute' => 'true'])->toString()
leymannx,
2

Jeśli chcesz też bezwzględny adres URL z kwerendą:

use Drupal\Core\Url;
// ...
Url::fromRoute('<current>', [], ['query' => \Drupal::request()->query->all(), 'absolute' => 'true'])->toString();
David Thomas
źródło