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


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.


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()

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


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


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

7

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

Url::fromRoute('<current>',array(),array('absolute'=>'true'));

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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.