Отримати псевдонім шляху від NID (або об'єкта вузла)


22

У мене об’єкт вузла, і я намагаюся використовувати його, щоб отримати заданий шлях в Drupal 8.

Був drupal_lookup_path()у Drupal 7, але я не бачу жодного еквівалента чи документації для Drupal 8.

Який новий спосіб "Drupal" отримати шлях від об'єкта вузла?

Це було б щось просте, як $node->get('path')?

Це здається простим питанням, але я абсолютно абсолютно не знаходжу жодної документації на нього.

Зауважте, я не хочу псевдонім шляху для поточного шляху; Я хочу псевдонім шляху для довільного вузла, заданого об'єкта вузла або ідентифікатора вузла.



Я думаю, що це може бути дублікат, перевірте пов'язане питання, чи багато відповідей.
Кевін

В іншому запитанні є відповіді, які говорять про те, як отримати псевдонім шляху для поточного шляху, а не для вузла, для якого ОП знає ідентифікатор вузла.
kiamlaluno

Це не дублікат - я не хочу поточного шляху. Я хочу, щоб шлях задав об'єкт довільного вузла або NID.
Джек Райан

Так, це не дублікат, дивіться мою відповідь.
4k4

Відповіді:


43

Щоб отримати шлях для ідентифікатора вузла, використовуйте AliasManager :: getAliasByPath :

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

3
Так, це виглядає правильно і простіше, ніж моє рішення. Дякую!
Джек Райан

19

Як щодо використання URL-адреси :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();

5
IIRC, основна відмінність цього і використання AliasManager, полягає в тому, що це також забезпечить запуск процесорів вихідного шляху, в той час як AliasManager просто здійснює пошук псевдоніму. Ви також можете отримати Urlоб'єкт безпосередньо як $node->toUrl().
mpdonadio

1
Набагато краще рішення.
Патрік

16

Якщо у вас є лише nid, рішення 4k4

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

Чудово працює. Але якщо у вас вже є об’єкт вузла, ви можете пропустити крок або два. Вузли фактично мають вбудовані методи отримання URL-адрес.

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

Повертає псевдонім URL-адресу вузла.

toUrl () повертає об’єкт URL. Дивіться тут https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

і toString () - це метод об’єкта url, який повертає рядкове представлення URL-адреси.


9
Зауважте, що $node->toUrl()->setAbsolute()->toString()повернеться абсолютна URL-адреса, корисна для обміну тощо
Тім

2

Ви також можете використовувати метод завантаження з, path.alias_storageщоб повернути масив деталей псевдоніма або булева помилка, якщо для цього вузла не знайдено шлях.

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


2

Найкращий спосіб отримати URL-адресу вузла від об’єкта вузла-

  • Абсолютний шлях : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Відносний шлях : $ node-> toUrl () -> toString ();

Він також буде обробляти мову вузлів.


0

Якщо ви хочете отримати URL-адресу псевдоніма вузла за мовами, не забудьте скористатися такою мовою.

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

Якщо ви використовуєте його в класі, не забудьте правильно використовувати ін'єкцію залежностей.


-5

Я сподівався на більш "друпальське" рішення, але ось що я змусив себе виконати цю роботу:

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

    $data = $db
        ->select('url_alias', 'u')
        ->fields('u', ['alias'])
        ->condition('source', '/node/' . $nid)
        ->execute()
        ->fetchField();
    return $data;
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.