从Drupal 8中的节点ID创建链接

Nic*_*sin 18 drupal drupal-8

我正在检查Drupal 8并尝试根据文章的节点ID生成链接.在Drupal 7中它是这样的:

$options = array('absolute' => TRUE);
$nid = 1; // Node ID
$url = url('node/' . $nid, $options);
Run Code Online (Sandbox Code Playgroud)

这导致与正确的url-alias的绝对链接.

所以url() - 函数似乎已被弃用; 什么是Drupal-8方式?对我来说看起来像一个非常基本的功能,但我找不到任何有用的参考.

Pie*_*yle 35

您需要使用\Drupal\Core\Url该类,特别是其fromRoute静态方法.Drupal 8使用名称与其实际URL路径不同的路由.在您的情况下,使用的路由是节点实体的规范路由:entity.node.canonical.\Drupal\Core\Url::fromRoute()不会返回字符串,而是返回一个对象.要将URL作为字符串获取,您需要调用其toString()方法.

$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();
Run Code Online (Sandbox Code Playgroud)

静态方法不易测试,$url->toString()需要初始化容器.你可以用一个调用替换静态方法UrlGeneratorInterface::generateFromRoute()上的url_generator服务.

$options = ['absolute' => TRUE];
$url = $this->url_generator->generateFromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个方法被标记为@internal因此你不应该在用户代码中使用它(即在Drupal核心之外).


ley*_*nnx 5

创建绝对URL:

$options = ['absolute' => TRUE];
$url_object = Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
// will output http://example.com/path-to-my-node
Run Code Online (Sandbox Code Playgroud)

创建绝对链接对象:

$options = ['absolute' => TRUE, 'attributes' => ['class' => 'this-class']];
$node_title = Drupal\Core\Render\Markup::create('<span>' . $node_title . '</span>');
$link_object = Drupal\Core\Link::createFromRoute($node_title, 'entity.node.canonical', ['node' => $nid], $options);
// will output <a href="http://example.com/path-to-my-node" class="this-class"><span>My Node's Title</span></a>
Run Code Online (Sandbox Code Playgroud)


ya.*_*eck 5

如果您已完全加载节点对象,您只需调用$node->toUrl()即可获取所需的 URL。默认情况下,它返回节点(node/NID)的规范 URL,但可以构建节点实体定义中列出的其他 URL(请参阅Drupal\node\Entity\Node.php)。其他实体类型也是如此。

$options = ['absolute' => TRUE];
$view_link = Link::fromTextAndUrl(t('View'), $node->toUrl('canonical', $options));
$edit_link = Link::fromTextAndUrl(t('Edit'), $node->toUrl('edit-form', $options));
$delete_link = Link::fromTextAndUrl(t('Delete'), $node->toUrl('delete-form', $options));
Run Code Online (Sandbox Code Playgroud)