Uzyskaj alias ścieżki z NID (lub obiektu węzła)

22

Mam obiekt węzła i próbuję go użyć, aby uzyskać daną ścieżkę w Drupal 8.

Był drupal_lookup_path()w Drupal 7, ale nie widzę żadnych odpowiedników ani dokumentacji dla Drupal 8.

Jaki jest nowy sposób „Drupala”, aby uzyskać ścieżkę z obiektu węzła?

Czy byłoby to coś prostego $node->get('path')?

To wydaje się proste pytanie, ale absolutnie nie znajduję na nim żadnej dokumentacji.

Zauważ, że nie chcę aliasu ścieżki dla bieżącej ścieżki; Chcę alias ścieżki dla dowolnego węzła, biorąc pod uwagę obiekt węzła lub identyfikator węzła.

Jack Ryan
źródło
3
Możliwy duplikat Uzyskaj bieżący alias lub ścieżkę?
Kevin
Myślę, że może to być duplikat, sprawdź połączone pytanie, na które jest wiele odpowiedzi.
Kevin
Drugie pytanie zawiera odpowiedzi na pytanie, jak uzyskać alias ścieżki dla bieżącej ścieżki, a nie dla węzła, dla którego OP zna identyfikator węzła.
kiamlaluno
To nie jest duplikat - nie chcę bieżącej ścieżki. Chcę, aby ścieżka otrzymała dowolny obiekt węzła lub identyfikator NID.
Jack Ryan,
Tak, to nie jest duplikat, patrz moja odpowiedź.
4k4

Odpowiedzi:

43

Aby uzyskać ścieżkę dla identyfikatora węzła, użyj AliasManager :: getAliasByPath :

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
4k4
źródło
3
Tak, to wygląda dobrze i jest prostsze niż moje rozwiązanie. Dziękuję Ci!
Jack Ryan,
19

Co z używaniem adresu URL :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();
Kevin
źródło
5
IIRC, podstawowa różnica między tym a korzystaniem z AliasManager, polega na tym, że zapewni to również działanie procesorów ścieżki wychodzącej, podczas gdy AliasManager po prostu wyszukuje alias. Możesz także pobrać Urlobiekt bezpośrednio jako $node->toUrl().
mpdonadio
1
Znacznie lepsze rozwiązanie.
Patrick
16

Jeśli masz tylko nid, rozwiązanie 4k4

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

Działa świetnie. Ale jeśli masz już obiekt węzła, możesz pominąć krok lub dwa. Węzły faktycznie mają wbudowane metody uzyskiwania adresów URL.

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

Zwróci aliasowany adres URL węzła.

toUrl () zwraca obiekt url. Zobacz tutaj https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

a toString () to metoda obiektu url, która zwraca ciąg znaków reprezentujący adres url.

Matt
źródło
9
Zwróć uwagę, że $node->toUrl()->setAbsolute()->toString()zwróci bezwzględny adres URL, przydatny do udostępniania itp.
Tim
2

Możesz także użyć metody load from, path.alias_storageaby zwrócić tablicę szczegółów aliasu lub wartość logiczną false, jeśli nie znaleziono ścieżki dla tego węzła.

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

rchaplin
źródło
2

Najlepszy sposób na uzyskanie adresu URL węzła z obiektu węzła

  • Ścieżka bezwzględna : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Ścieżka względna : $ node-> toUrl () -> toString ();

Będzie także obsługiwał język węzłów.

Prem Patel
źródło
0

Jeśli chcesz uzyskać adres URL aliasu węzła według języków, nie zapomnij użyć takiego języka.

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

Jeśli używasz go w klasie, nie zapomnij poprawnie użyć wstrzykiwania zależności.

Diosbel Mezquía
źródło
-5

Miałem nadzieję na bardziej „drupaleskie” rozwiązanie, ale oto, co postanowiłem zrobić.

  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
źródło