我正在检查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核心之外).
创建绝对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)
如果您已完全加载节点对象,您只需调用$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)
归档时间: |
|
查看次数: |
28781 次 |
最近记录: |