Como obtenho o ID do nó atual?

51

No Drupal 7, se eu quisesse obter o ID do nó atualmente exibido (por exemplo node/145), poderia obtê-lo com a arg()função Nesse caso, arg(1)retornaria 145.

Como posso conseguir o mesmo no Drupal 8?

24ma13wg
fonte

Respostas:

103

O parâmetro terá sido convertido de nid para objeto de nó completo quando você tiver acesso a ele, portanto:

$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();
}

Veja o registro de alterações para mais informações.

Clive
fonte
4
Eu só quero adicionar você tem que tomar cuidado com isso - eu acabei de ser picado em que \ Drupal :: routeMatch () -> getParameter ('node'); retornará uma matriz de 1 item (o ID do nó) nas páginas de exclusão da revisão do nó; portanto, se você chamar um método no que você supõe ser um objeto, receberá um erro fatal como "Erro fatal: chame a função de membro getType ( ) na string ".
Jeff Burnz
Como posso obter parâmetros, se eu visitei /taxonomy/term/{tid}?
AshwinP
É um substituto funcional para menu_get_object?
Frank Robert Anderson
Praticamente sim @Frank. É um pouco diferente, é claro, mas se você cair em um contexto que não sabe em que página da entidade (se houver) está, esta é a maneira recomendada de descobrir
Clive
11
@AshwinP O parâmetro é o que você escreve dentro {}da sua rota. Para termos de taxonomia, o paramater de rota é chamado taxonomy_term, definição de rota /taxonomy/term/{taxonomy_term}. Aqui você pode obtê-lo assim \Drupal::routeMatch()->getParameter('taxonomy_term'),.
Jdrupal 22/08
17

É correto usar \Drupal::routeMatch()->getParameter('node'). Se você apenas precisar do ID do nó, poderá usar \Drupal::routeMatch()->getRawParameter('node').

Maouna
fonte
4

se você estiver usando ou criando um bloco personalizado, precisará seguir este código para obter o ID do nó da URL atual.

// 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'));
}
gauri shankar
fonte
Esta postagem não faz sentido. Não há como alguém saber para onde vai esse código.
Lester Peabody
2

Nota na página de visualização do nó, o seguinte não funciona:

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

Para a página de visualização do nó, você deve carregar o nó desta maneira:

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

Como carregar o objeto nó na página de visualização do nó?

oknate
fonte