从NID(或节点对象)获取路径别名


22

我有一个节点对象,我试图用它来获取Drupal 8中的给定路径。

drupal_lookup_path()Drupal 7中有这个功能,但是我没有看到任何与Drupal 8相当的产品或文档。

从节点对象获取路径的新“ Drupal”方法是什么?

会是简单的东西$node->get('path')吗?

这似乎是一个简单的问题,但是我绝对找不到关于它的任何文档。

注意,我不需要当前路径的路径别名。我想要给定节点对象或节点ID的任意节点的路径别名。



我认为这可能是重复的,请检查链接的问题,其中有很多答案。
凯文(Kevin)

另一个问题有答案,说明如何获取当前路径的路径别名,而不是OP知道其节点ID的节点的路径别名。
kiamlaluno

它不是重复的-我不需要当前路径。我想要给定任意节点对象或NID的路径。
杰克·瑞安

是的,这不是重复的,请参阅我的答案。
4k4,19:

Answers:



19

怎样使用网址

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

您也可以使用load方法从path.alias_storage返回别名详细信息的数组,如果没有找到该节点的路径,则返回boolean false。

$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

我一直希望有一个更“ Drupalesque”的解决方案,但这是我自己做的工作:

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

    $data = $db
        ->select('url_alias', 'u')
        ->fields('u', ['alias'])
        ->condition('source', '/node/' . $nid)
        ->execute()
        ->fetchField();
    return $data;
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.