Получить псевдоним пути из NID (или объекта узла)

22

У меня есть объект узла, и я пытаюсь использовать его для получения заданного пути в Drupal 8.

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

Каков новый "Drupal" способ получить путь от объекта узла?

Было бы что-то простое, как $node->get('path')?

Это кажется простым вопросом, но я просто не нахожу никакой документации по этому вопросу.

Заметьте, я не хочу псевдоним пути для текущего пути; Мне нужен псевдоним пути для произвольного узла, учитывая объект узла или идентификатор узла.

Джек Райан
источник
Я думаю, что это может быть дубликатом, проверьте связанный вопрос, есть много ответов.
Кевин
На другой вопрос есть ответы, в которых говорится, как получить псевдоним пути для текущего пути, а не для узла, для которого OP знает идентификатор узла.
kiamlaluno
Это не дубликат - я не хочу текущий путь. Я хочу, чтобы путь дал произвольный объект узла или NID.
Джек Райан,
Да, это не дубликат, смотрите мой ответ.
4k4

Ответы:

43

Чтобы получить путь для идентификатора узла, используйте AliasManager :: getAliasByPath :

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
4k4
источник
3
Да, это выглядит правильно и проще, чем мое решение. Спасибо!
Джек Райан,
19

Как насчет использования URL :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();
Kevin
источник
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.

Matt
источник
9
Обратите внимание, что $node->toUrl()->setAbsolute()->toString()будет возвращен абсолютный URL, полезный для обмена и т. Д.
Тим
2

Вы также можете использовать метод load path.alias_storageдля возврата массива сведений о псевдониме или логического false, если для этого узла не найден путь.

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

rchaplin
источник
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;
  }
Джек Райан
источник