Как я могу получить текущий идентификатор узла?

51

В Drupal 7, если бы я хотел получить идентификатор узла отображаемого в данный момент узла (например node/145), я мог бы получить его с помощью arg()функции. В этом случае arg(1)вернется 145.

Как я могу добиться того же в Drupal 8?

24ma13wg
источник

Ответы:

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
Я просто хочу добавить, что вы должны быть осторожны с этим - меня только что задело, где \ Drupal :: routeMatch () -> getParameter ('node'); вернет массив из 1 элемента (идентификатор узла) на страницах удаления ревизии узла, поэтому, если вы вызовете метод для того, что вы считаете объектом, вы получите фатальную ошибку, такую ​​как «Неустранимая ошибка: вызов функции-члена getType ( ) на строку ".
Джефф Бернс
Как я могу получить параметр, если я посетил /taxonomy/term/{tid}?
AshwinP
Это функциональная замена menu_get_object?
Фрэнк Роберт Андерсон
В значительной степени да @ Фрэнк. Конечно, это немного по-другому, но если вы оказались в контексте, который не знает, на какой странице сущности (если она есть) она есть, это рекомендуемый способ выяснить
Клайв
1
@AshwinP Параметр - это то, что вы пишете внутри {}своего маршрута. Для терминов таксономии называется параметр маршрута taxonomy_term, определение маршрута /taxonomy/term/{taxonomy_term}. Здесь вы можете получить это так \Drupal::routeMatch()->getParameter('taxonomy_term').
Jdrupal
17

Это правильно использовать \Drupal::routeMatch()->getParameter('node'). Если вам просто нужен идентификатор узла, вы можете использовать \Drupal::routeMatch()->getRawParameter('node').

Maouna
источник
4

Если вы используете или создаете пользовательский блок, вам нужно следовать этому коду, чтобы получить текущий идентификатор узла URL.

// 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'));
}
Гаури Шанкар
источник
Этот пост не имеет смысла. Никто не знает, куда идет этот код.
Лестер Пибоди
2

Обратите внимание, что на странице предварительного просмотра узла не работает следующее:

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

Для страницы предварительного просмотра узла вы должны загрузить узел следующим образом:

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

Как загрузить объект узла на странице предварительного просмотра узла?

oknate
источник