Wie erhalte ich die aktuelle Knoten-ID?


51

Wenn ich in Drupal 7 die Knoten-ID des aktuell angezeigten Knotens abrufen wollte (z. B. node/145), konnte ich sie mit der arg()Funktion abrufen. In diesem Fall arg(1)würde 145 zurückgeben.

Wie kann ich dasselbe in Drupal 8 erreichen?

Antworten:


103

Der Parameter wurde von nid auf das vollständige Knotenobjekt aktualisiert, sobald Sie darauf zugreifen.

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

Weitere Informationen finden Sie im Änderungsdatensatz .


4
Ich möchte nur hinzufügen, dass Sie damit vorsichtig sein müssen. Ich habe gerade einen Fehler gemacht, bei dem \ Drupal :: routeMatch () -> getParameter ('node'); Gibt ein Array mit 1 Element (der Knoten-ID) auf Seiten zum Löschen von Knotenversionen zurück. Wenn Sie also eine Methode aufrufen, bei der Sie davon ausgehen, dass es sich um ein Objekt handelt, wird ein schwerwiegender Fehler wie "Schwerwiegender Fehler: Aufruf einer Mitgliedsfunktion getType ( ) an Schnur ".
Jeff Burnz

Wie kann ich Parameter erhalten, wenn ich besucht habe /taxonomy/term/{tid}?
AshwinP

Ist dies ein funktionaler Ersatz für menu_get_object?
Frank Robert Anderson

So ziemlich ja @Frank. Das ist natürlich ein bisschen anders, aber wenn Sie in einen Kontext
Clive

1
@AshwinP Der Parameter ist das, was Sie {}in Ihre Route eingeben . Für Taxonomie Begriffe wird die Route genannt Paramater taxonomy_term, Routendefinition /taxonomy/term/{taxonomy_term}. Hier können Sie es wie diese erhalten, \Drupal::routeMatch()->getParameter('taxonomy_term').
Jdrupal

17

Es ist richtig zu benutzen \Drupal::routeMatch()->getParameter('node'). Wenn Sie nur die Knoten-ID benötigen, können Sie verwenden \Drupal::routeMatch()->getRawParameter('node').


4

Wenn Sie einen benutzerdefinierten Block verwenden oder erstellen, müssen Sie diesen Code befolgen, um die aktuelle URL-Knoten-ID abzurufen.

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

Dieser Beitrag macht keinen Sinn. Niemand kann wissen, wohin dieser Code führt.
Lester Peabody

2

Hinweis: Auf der Seite mit der Knotenvorschau funktioniert Folgendes nicht:

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

Für die Knotenvorschau müssen Sie den Knoten folgendermaßen laden:

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

Wie lade ich ein Knotenobjekt in die Knotenvorschau?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.