如何获取当前的节点ID?


51

在Drupal 7中,如果我想获取当前显示的节点的节点ID(例如node/145),则可以使用arg()函数获取它。在这种情况下,arg(1)将返回145。

如何在Drupal 8中实现相同的目标?

Answers:


103

到您访问该参数时,该参数将从nid向上映射到完整节点对象,因此:

$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
  // You can get nid and anything else you need from the node object.
  $nid = $node->id();
}

有关更多信息,请参见更改记录


4
我只是想补充一下,您必须小心-我只是st到\ Drupal :: routeMatch()-> getParameter('node'); 会在节点修订删除页面上返回1项(节点ID)的数组,因此,如果您以假定为对象的方式调用方法,则会出现致命错误,例如“致命错误:调用成员函数getType( )在字符串上”。
杰夫·伯恩斯

如果我访问过,如何获取参数/taxonomy/term/{tid}
AshwinP

这是功能替代品menu_get_object吗?
弗兰克·罗伯特·安德森

差不多是@Frank。当然,这有点不同,但是如果您不知道其所在的实体页面(如果有)处于上下文中,则这是发现问题的推荐方法
Clive

1
@AshwinP参数是您{}在路由中编写的任何内容。对于分类术语,称为路径参数taxonomy_term,即路径定义/taxonomy/term/{taxonomy_term}。在这里,您可以像这样获得它\Drupal::routeMatch()->getParameter('taxonomy_term')
Jdrupal

17

使用是正确的\Drupal::routeMatch()->getParameter('node')。如果只需要节点ID,则可以使用\Drupal::routeMatch()->getRawParameter('node')


4

如果您正在使用或创建自定义块,则必须遵循以下代码来获取当前的URL节点ID。

// add libraries
use Drupal\Core\Cache\Cache;  

// code to get nid

$node = \Drupal::routeMatch()->getParameter('node');
  $node->id()  // get current node id (current url node id)


// for cache

public function getCacheTags() {
  //With this when your node change your block will rebuild
  if ($node = \Drupal::routeMatch()->getParameter('node')) {
  //if there is node add its cachetag
    return Cache::mergeTags(parent::getCacheTags(), array('node:' . $node->id()));
  } else {
    //Return default tags instead.
    return parent::getCacheTags();
  }
}

public function getCacheContexts() {
  //if you depends on \Drupal::routeMatch()
  //you must set context of this block with 'route' context tag.
  //Every new route this block will rebuild
  return Cache::mergeContexts(parent::getCacheContexts(), array('route'));
}

这篇文章没有意义。任何人都无法知道此代码的去向。
Lester Peabody

2

请注意,在节点预览页面上,以下操作无效:

$node = \Drupal::routeMatch()->getParameter('node');
$nid = $node->id();

对于节点预览页面,必须以这种方式加载节点:

$node = \Drupal::routeMatch()->getParameter('node_preview');
$nid = $node->id();

如何在节点预览页面中加载节点对象?

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.