Wie erhalte ich den aktuellen Pfadalias oder -pfad?

56

Wie kann ich den aktuellen Alias ​​und / oder Pfad in Drupal 8 erhalten?

In Drupal 7 habe ich das mit gemacht drupal_get_path_alias(). Was ist der entsprechende Code, den ich in Drupal 8 verwenden sollte?

Yusef Mohamadi
quelle

Antworten:

108

Einige der anderen Antworten waren nur in früheren Alpha / Beta-Versionen von Drupal 8 korrekt oder schienen unvollständig zu sein. Ab Beta7 (und hoffentlich dauerhaft) sollten folgende Regeln gelten:

Für den aktuellen unformatierten Pfad (den nicht aliasierten Drupal-Pfad):

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

Für die aktuelle URI , die so ziemlich eine direkte Darstellung der Anforderung ist (sie kann sogar eine Abfragezeichenfolge enthalten):

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

Es gibt natürlich keine Garantie, dass dieser $current_uriWert Ihnen einen Alias ​​gibt, auch wenn einer für die Anforderung verfügbar ist, da er nur das darstellt, was der Benutzer angefordert hat. Um also genau das zu tun, wonach Sie fragen (Alias ​​abrufen, falls verfügbar, und Pfad, falls nicht), können Sie meines Erachtens Folgendes tun:

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

Natürlich ist es abhängig von der Art der Verarbeitung am besten, mit Routen anstatt mit Pfaden zu arbeiten, aber ich nehme an, das ist ein ganz anderes Thema.

rjacobs
quelle
Warum erwähnen Sie, dass es besser ist, Routen anstelle von Pfaden zu verwenden? Können Sie ein kurzes Beispiel / einen Grund nennen?
itsdarrylnorris
@ darol100, ich bin vielleicht nicht der Beste, der eine umfassende Antwort darauf gibt, aber ich kann Ihnen sagen, dass die Verwendung von Pfaden für die programmatische URL-Generierung in Drupal 8 offiziell abgeschrieben ist - siehe: drupal.org/node/2046643 . Symfony-Routen bieten eine robustere Möglichkeit, Ressourcen unabhängig von den Pfadstrukturen zuzuordnen (wenn Sie einen Link mithilfe von Routen erstellen, funktioniert dieser Link auch dann, wenn sich der URL-Pfad / das URL-Muster ändert).
RJACOBS
Nur eine Anmerkung, ::getAliasByPath()die keine Pfadzeichenfolge ohne einen führenden Schrägstrich mehr akzeptiert (seit Beta13, glaube ich).
othermachines
5
getAliasByPathGibt den Pfad ohne Sprachpräfix zurück. Irgendeine Idee, wie man das löst?
Philipp Michael
1
Was ist mit einer Zweigvorlage?
ESSEN
35

Der richtige Weg für die URL ohne den URL-Alias.

$current_path = \Drupal::service('path.current')->getPath()
Daniel Wehner
quelle
Installiert \Drupal::request()->getRequestUri();respect Drupal in einem Unterordner?
Brian
Wie würde ich das für einen nicht aktuellen Pfad tun? Gibt es eine Möglichkeit, es nur aus einer Zeichenfolge zu erhalten?
BrandenB171
Wie erhalte ich den absoluten Pfad wie diesen: mydrupalsite.org/node/123 ?
mcaleaa
1
global $ base_root; $ current_uri = \ Drupal :: request () -> getRequestUri (); $ current_path = $ base_root. $ current_uri;
OKNATE
18

In Drupal 8 können Sie dies mit Twig tun:

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

Beispiel:

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

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

Nicola De Lazzari
quelle
1
Great find @ nicola-de-lazzari - Auch Ihre Antworten funktionieren in Views. Ansicht> Felder> Ergebnisse umschreiben> Linkpfad akzeptiert {{ url('<current>') }}, obwohl nicht unter Ersetzungsmuster aufgeführt.
Piet
16

Um den aktuellen Pfad in Drupal 7 zu erhalten, verwenden Sie current_path(), in Drupal 8 verwenden Sie $url = Url::fromRoute('<current>');.

Quelle: https://www.drupal.org/node/2382211

Nitesh Sethia
quelle
current_path()und drupal_get_path_alias()sie sind verschiedene Funktionen.
itsdarrylnorris
Dies sollte die Antwort sein, da diese Version den Pfad mit dem Sprachpräfix angibt.
Guillaume Bois
Das OP fragt nach dem D8-Äquivalent von drupal_get_path_alias (). Sie sind den aktuellen Pfad zurückkehrt und nicht das aliased Pfad vom Knoten‘D7 /'.$ nid
macjules
9

So rufen Sie den aktuellen Pfad (Alias-Pfad) ab:

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

So rufen Sie den aktuellen Pfad (Systempfad) ab:

// Returns node/1
$path = $url->getInternalPath();
Rahul Baisane
quelle
7

Für Drupal 8 ist dies die sauberste Lösung, die ich finden konnte:

Url::fromRoute('<current>',array(),array('absolute'=>'true'));
Crobicha
quelle
5
\Drupal\Core\Url::fromRoute('<current>', [], ['absolute' => 'true'])->toString()
Leymannx
2

Wenn Sie die absolute URL auch mit dem Querystring wollen:

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