Bagaimana cara mendapatkan alias jalur atau jalur saat ini?


56

Bagaimana saya bisa mendapatkan alias dan / atau jalur saat ini di Drupal 8?

Di Drupal 7 saya melakukan ini dengan drupal_get_path_alias(). Apa kode setara yang harus saya gunakan di Drupal 8?

Jawaban:


108

Beberapa jawaban lain hanya benar selama versi alpha / beta sebelumnya dari Drupal 8, atau tampaknya tidak lengkap. Pada beta7 (dan semoga secara permanen), aturan berikut harus berlaku:

Untuk jalur mentah saat ini (jalur Drupal tidak beralasan):

$current_path = \Drupal::service('path.current')->getPath()

Untuk URI saat ini , yang merupakan representasi langsung dari permintaan (bahkan mungkin termasuk string kueri):

$current_uri = \Drupal::request()->getRequestUri();

Tentu saja tidak ada jaminan bahwa $current_urinilai ini akan memberi Anda alias, bahkan jika ada yang tersedia untuk permintaan tersebut, karena hanya mewakili apa yang diminta pengguna. Jadi untuk benar-benar melakukan apa yang Anda minta (dapatkan alias jika tersedia, dan path jika tidak) saya pikir Anda bisa melakukannya:

$current_path = \Drupal::service('path.current')->getPath();
$result = \Drupal::service('path.alias_manager')->getAliasByPath($current_path);

Tentu saja tergantung pada jenis pemrosesan yang Anda lakukan, mungkin yang terbaik adalah bekerja dengan rute daripada jalur, tapi saya kira itu adalah topik lain.


mengapa Anda menyebutkan bahwa akan lebih baik menggunakan rute daripada jalur? Bisakah Anda memberikan contoh / alasan singkat?
itsdarrylnorris

@ darol100, saya mungkin bukan orang terbaik untuk memberikan jawaban komprehensif untuk itu, tetapi saya dapat memberi tahu Anda bahwa penggunaan jalur untuk pembuatan URL terprogram secara resmi didepresiasi di Drupal 8 - lihat: drupal.org/node/2046643 . Rute Symfony menyediakan cara yang lebih kuat untuk memetakan sumber daya yang tidak bergantung pada struktur jalur (jika Anda membuat tautan menggunakan rute, tautan itu akan tetap berfungsi bahkan jika jalur URL / pola berubah).
rjacobs

Hanya sebuah catatan yang ::getAliasByPath()tidak akan lagi menerima jalur string tanpa garis miring (sejak beta13 saya percaya).
mesin lainnya

5
getAliasByPathmengembalikan jalur tanpa awalan bahasa. Ada ide untuk mengatasi ini?
Philipp Michael

1
bagaimana dengan dari dalam template ranting?
MAKAN

35

Cara yang tepat untuk URL tanpa alias URL.

$current_path = \Drupal::service('path.current')->getPath()

Apakah \Drupal::request()->getRequestUri();penghormatan terhadap Drupal dipasang di subfolder?
Brian

bagaimana saya melakukan itu untuk jalur yang tidak saat ini? apakah ada cara untuk mendapatkannya hanya dari string?
BrandenB171

Bagaimana cara mendapatkan jalur absolut, seperti ini: mydrupalsite.org/node/123 ?
mcaleaa

1
global $ base_root; $ current_uri = \ Drupal :: request () -> getRequestUri (); $ current_path = $ base_root. $ current_uri;
oknate


16

Untuk mendapatkan jalur saat ini di Drupal 7, Anda gunakan untuk menggunakan current_path(), tetapi di Drupal 8 Anda gunakan $url = Url::fromRoute('<current>');.

Sumber: https://www.drupal.org/node/2382211


current_path()dan drupal_get_path_alias()mereka adalah fungsi yang berbeda.
itsdarrylnorris

Ini harus menjadi jawaban karena versi ini memberikan path dengan awalan bahasa.
Guillaume Bois

OP meminta D8 yang setara dengan drupal_get_path_alias (). Anda mengembalikan jalur saat ini dan BUKAN jalur alias dari D7 'node /'.$ nid
macjules

9

Untuk mendapatkan jalur saat ini (alias path):

// Returns something like /about
$url = \Drupal\Core\Url::fromRoute('<current>');

Untuk mendapatkan jalur saat ini (jalur sistem):

// Returns node/1
$path = $url->getInternalPath();

7

Untuk Drupal 8, ini adalah solusi terbersih yang saya dapat temukan:

Url::fromRoute('<current>',array(),array('absolute'=>'true'));

5
\Drupal\Core\Url::fromRoute('<current>', [], ['absolute' => 'true'])->toString()
leymannx


2

Jika Anda ingin URL absolut dengan querystring juga:

use Drupal\Core\Url;
// ...
Url::fromRoute('<current>', [], ['query' => \Drupal::request()->query->all(), 'absolute' => 'true'])->toString();
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.