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?

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.


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').


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

Posting ini tidak masuk akal. Tidak ada cara bagi siapa pun untuk mengetahui kemana kode ini pergi.
Lester Peabody

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.