Bagaimana cara mendapatkan ID simpul saat ini?

51

Dalam Drupal 7, jika saya ingin mendapatkan id node dari node yang saat ini ditampilkan (misalnya node/145) saya bisa mendapatkannya dengan arg()fungsinya. Dalam hal ini, arg(1)akan mengembalikan 145.

Bagaimana saya bisa mencapai hal yang sama di Drupal 8?

24ma13wg
sumber

Jawaban:

103

Parameter akan di-upcast dari nid ke objek full node pada saat Anda mendapatkan akses ke sana, jadi:

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

Lihat catatan perubahan untuk informasi lebih lanjut.

Clive
sumber
4
Saya hanya ingin menambahkan Anda harus berhati-hati dengan ini - saya baru saja tersengat di mana \ Drupal :: routeMatch () -> getParameter ('node'); akan mengembalikan array 1 item (id node) pada halaman hapus revisi node, jadi jika Anda memanggil metode yang Anda anggap sebagai objek, Anda akan mendapatkan kesalahan fatal seperti "Kesalahan fatal: Memanggil ke fungsi anggota getType ( ) pada string ".
Jeff Burnz
Bagaimana saya bisa mendapatkan parameter, jika saya mengunjungi /taxonomy/term/{tid}?
AshwinP
Apakah ini pengganti fungsional untuk menu_get_object?
Frank Robert Anderson
Cukup banyak ya. Tentu saja ini sedikit berbeda, tetapi jika Anda berada dalam konteks yang tidak tahu halaman entitas apa (jika ada) aktif, ini adalah cara yang disarankan untuk mengetahuinya
Clive
1
@AshwinP Parameternya adalah apa pun yang Anda tulis di {}dalam rute Anda. Untuk istilah taksonomi paramater rute disebut taxonomy_term, definisi rute /taxonomy/term/{taxonomy_term}. Di sini Anda bisa mendapatkannya seperti ini \Drupal::routeMatch()->getParameter('taxonomy_term'),.
Jdrupal
17

Itu benar untuk digunakan \Drupal::routeMatch()->getParameter('node'). Jika Anda hanya memerlukan ID simpul, Anda dapat menggunakannya \Drupal::routeMatch()->getRawParameter('node').

Maouna
sumber
4

jika Anda menggunakan atau membuat blok khusus maka Anda harus mengikuti kode ini untuk mendapatkan id url node saat ini.

// 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
sumber
Posting ini tidak masuk akal. Tidak ada cara bagi siapa pun untuk mengetahui kemana kode ini pergi.
Lester Peabody
2

Catatan pada halaman pratinjau node, berikut ini tidak berfungsi:

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

Untuk halaman pratinjau simpul, Anda harus memuat simpul dengan cara ini:

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

Bagaimana cara memuat objek simpul di halaman pratinjau simpul?

oknate
sumber