Pfadalias von NID (oder Knotenobjekt) abrufen

22

Ich habe ein Node-Objekt und versuche es zu verwenden, um einen bestimmten Pfad in Drupal 8 zu erhalten.

Es gab drupal_lookup_path()in Drupal 7, aber ich sehe keine Entsprechung oder Dokumentation für Drupal 8.

Was ist die neue "Drupal" -Methode, um einen Pfad von einem Knotenobjekt abzurufen?

Wäre es so einfach $node->get('path')?

Dies scheint eine einfache Frage zu sein, aber ich finde absolut keine Dokumentation dazu.

Beachten Sie, dass ich keinen Pfadalias für den aktuellen Pfad möchte. Ich möchte den Pfad-Alias ​​für einen beliebigen Knoten, der ein Knotenobjekt oder eine Knoten-ID hat.

Jack Ryan
quelle
3
Mögliches Duplikat von Aktuellen Pfadalias oder Pfad abrufen?
Kevin
Ich denke, dies könnte ein Duplikat sein, überprüfen Sie die verknüpfte Frage, es gibt viele Antworten.
Kevin
Die andere Frage enthält Antworten zum Abrufen des Pfadalias für den aktuellen Pfad, nicht für einen Knoten, für den das OP die Knoten-ID kennt.
kiamlaluno
Es ist kein Duplikat - ich möchte nicht den aktuellen Pfad. Ich möchte, dass dem Pfad ein beliebiges Knotenobjekt oder eine beliebige NID zugewiesen wird.
Jack Ryan
Ja, das ist kein Duplikat, siehe meine Antwort.
4. 4.

Antworten:

43

Verwenden Sie AliasManager :: getAliasByPath, um den Pfad für eine Knoten-ID abzurufen :

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
4k4
quelle
3
Ja, das sieht richtig aus und ist einfacher als meine Lösung. Vielen Dank!
Jack Ryan
19

Was ist mit der Verwendung von URL :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();
Kevin
quelle
5
IIRC, der Hauptunterschied zu AliasManager, stellt sicher, dass auch Prozessoren für ausgehende Pfade ausgeführt werden, während AliasManager nur die Alias-Suche ausführt. Sie können das UrlObjekt auch direkt als erhalten $node->toUrl().
mpdonadio
1
Viel bessere Lösung.
Patrick
16

Wenn Sie nur die NID haben, ist 4k4 die Lösung von

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);

Funktioniert super. Wenn Sie jedoch bereits ein Knotenobjekt haben, können Sie ein oder zwei Schritte überspringen. Die Knoten verfügen über integrierte Methoden zum Abrufen von URLs.

$node->toUrl()->toString();

Gibt die Alias-URL des Knotens zurück.

toUrl () gibt ein URL-Objekt zurück. Siehe hier https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

und toString () ist eine Methode des URL-Objekts, die die Zeichenfolgendarstellung der URL zurückgibt.

Matt
quelle
9
Beachten Sie, dass $node->toUrl()->setAbsolute()->toString()die absolute URL zurückgegeben wird, die für das Teilen usw. nützlich ist.
Tim
2

Sie können auch die load-Methode von verwenden path.alias_storage, um ein Array der Alias-Details oder den booleschen Wert false zurückzugeben, wenn für diesen Knoten kein Pfad gefunden wurde.

$aliasArray = \Drupal::service('path.alias_storage')->load(['source' => '/node/' . $nid]);

rchaplin
quelle
2

Der beste Weg, um eine Knoten-URL von einem Knotenobjekt zu erhalten -

  • Absoluter Pfad : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Relativer Pfad : $ node-> toUrl () -> toString ();

Es wird auch die Knotensprache behandeln.

Prem Patel
quelle
0

Wenn Sie die Node-Alias-URL nach Sprachen erhalten möchten, vergessen Sie nicht, diese Sprache zu verwenden.

$alias_url = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'. $nid, $langcode);

Wenn Sie es in einer Klasse verwenden, vergessen Sie nicht, die Abhängigkeitsinjektion korrekt zu verwenden.

Diosbel Mezquía
quelle
-5

Ich hatte auf eine "Drupalesque" -Lösung gehofft, aber Folgendes habe ich mir vorgenommen, um diesen Job zu erledigen:

  function getPathFromNID($nid) {
    $db = \Drupal::database();

    $data = $db
        ->select('url_alias', 'u')
        ->fields('u', ['alias'])
        ->condition('source', '/node/' . $nid)
        ->execute()
        ->fetchField();
    return $data;
  }
Jack Ryan
quelle