Dapatkan path alias dari NID (atau objek node)

22

Saya memiliki objek simpul, dan saya mencoba menggunakannya untuk mendapatkan path yang diberikan di Drupal 8.

Ada drupal_lookup_path()di Drupal 7 tapi saya tidak melihat padanan atau dokumentasi untuk Drupal 8.

Apa cara "Drupal" baru untuk mendapatkan jalur dari objek simpul?

Akankah itu menjadi sesuatu yang sederhana $node->get('path')?

Ini sepertinya pertanyaan sederhana, tapi saya sama sekali tidak menemukan dokumentasi apa pun di dalamnya.

Perhatikan saya tidak ingin alias path untuk path saat ini; Saya ingin alias path untuk node sewenang-wenang, diberi objek node atau ID node.

Jack Ryan
sumber
3
Kemungkinan duplikat Dapatkan alias jalur atau jalur saat ini?
Kevin
Saya pikir ini mungkin duplikat, periksa pertanyaan terkait ada banyak jawaban.
Kevin
Pertanyaan lain memiliki jawaban yang mengatakan bagaimana cara mendapatkan path alias untuk path saat ini, bukan untuk node yang OP tahu node ID.
kiamlaluno
Ini bukan duplikat - Saya tidak ingin jalur saat ini. Saya ingin path diberi objek node sewenang-wenang atau NID.
Jack Ryan
Ya, ini bukan duplikat, lihat jawaban saya.
4k4

Jawaban:

43

Untuk mendapatkan path untuk id node gunakan AliasManager :: getAliasByPath :

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
4k4
sumber
3
Yap, ini terlihat benar dan lebih sederhana dari solusi saya. Terima kasih!
Jack Ryan
19

Bagaimana dengan menggunakan Url :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();
Kevin
sumber
5
IIRC, perbedaan utama antara ini dan menggunakan AliasManager, adalah bahwa ini juga akan memastikan bahwa prosesor jalur keluar berjalan, sementara AliasManager hanya melakukan pencarian alias. Anda juga bisa mendapatkan Urlobjek secara langsung $node->toUrl().
mpdonadio
1
Solusi yang jauh lebih baik.
Patrick
16

Jika Anda hanya memiliki nid, solusi 4k4 untuk

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);

Bagus sekali. Tetapi jika Anda sudah memiliki objek simpul Anda dapat melewati satu atau dua langkah. Node sebenarnya memiliki metode bawaan untuk mendapatkan url.

$node->toUrl()->toString();

Akan mengembalikan url alias dari node.

toUrl () mengembalikan objek url. Lihat di sini https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

dan toString () adalah metode objek url yang mengembalikan representasi string dari url.

Mat
sumber
9
Catatan yang $node->toUrl()->setAbsolute()->toString()akan mengembalikan URL absolut, berguna untuk berbagi, dll.
Tim
2

Anda juga bisa menggunakan metode load dari path.alias_storageuntuk mengembalikan array dari alias alias atau boolean false jika tidak ada jalur yang ditemukan untuk node itu.

$aliasArray = \Drupal::service('path.alias_storage')->load(['source' => '/node/' . $nid]);

rchaplin
sumber
2

Cara terbaik untuk mendapatkan URL simpul dari simpul objek-

  • Absolute Path : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Relative Path : $ node-> toUrl () -> toString ();

Ini juga akan menangani bahasa simpul.

Prem Patel
sumber
0

Jika Anda ingin mendapatkan simpul alias url menurut bahasa, jangan lupa untuk menggunakan bahasa seperti ini.

$alias_url = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'. $nid, $langcode);

Jika Anda menggunakannya di kelas jangan lupa untuk menggunakan injeksi dependensi dengan benar.

Diosbel Mezquía
sumber
-5

Saya berharap untuk solusi yang lebih "Drupalesque", tapi inilah yang saya buat sendiri untuk melakukan pekerjaan itu:

  function getPathFromNID($nid) {
    $db = \Drupal::database();

    $data = $db
        ->select('url_alias', 'u')
        ->fields('u', ['alias'])
        ->condition('source', '/node/' . $nid)
        ->execute()
        ->fetchField();
    return $data;
  }
Jack Ryan
sumber