¿Cómo obtengo el ID de nodo actual?


51

En Drupal 7, si quisiera obtener la identificación del nodo del nodo que se muestra actualmente (por ejemplo node/145), podría obtenerlo con la arg()función. En este caso, arg(1)devolvería 145.

¿Cómo puedo lograr lo mismo en Drupal 8?

Respuestas:


103

El parámetro habrá sido subido de nid a objeto de nodo completo para cuando tenga acceso a él, por lo tanto:

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

Vea el registro de cambios para más información.


44
Solo quiero agregar que debes tener cuidado con esto: me acabo de picar donde \ Drupal :: routeMatch () -> getParameter ('node'); devolverá una matriz de 1 elemento (la identificación del nodo) en las páginas de eliminación de revisión de nodo, por lo que si llama a un método en lo que supone que es un objeto, obtendrá un error fatal como "Error fatal: Llame a una función miembro getType ( ) en cadena ".
Jeff Burnz

¿Cómo puedo obtener el parámetro, si lo visité /taxonomy/term/{tid}?
AshwinP

¿Es este un reemplazo funcional para menu_get_object?
Frank Robert Anderson

Bastante sí, @Frank. Por supuesto, es un poco diferente, pero si se cae en un contexto que no sabe en qué página de entidad (si la hay) está, esta es la forma recomendada de averiguarlo
Clive

1
@AshwinP El parámetro es lo que escriba dentro {}de su ruta. Para términos de taxonomía, el parámetro de ruta se llama taxonomy_termdefinición de ruta /taxonomy/term/{taxonomy_term}. Aquí se puede conseguir de esta manera, \Drupal::routeMatch()->getParameter('taxonomy_term').
Jdrupal

17

Es correcto de usar \Drupal::routeMatch()->getParameter('node'). Si solo necesita la ID del nodo, puede usarla \Drupal::routeMatch()->getRawParameter('node').


4

si está utilizando o creando un bloque personalizado, debe seguir este código para obtener la identificación del nodo de URL actual.

// 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'));
}

Esta publicación no tiene sentido. No hay forma de que nadie sepa a dónde va este código.
Lester Peabody

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.