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?

Yusef
sumber

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.

rjacobs
sumber
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()
Daniel Wehner
sumber
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
18

Di Drupal 8 Anda dapat melakukan ini dengan Twig:

{{ url('<current>') }}

contoh:

<a href="{{ url('<current>') }}">{{ 'Reload'|t }}</a>

dari: https://www.drupal.org/docs/8/theming/twig/functions-in-twig-templates

Nicola De Lazzari
sumber
1
Great find @ nicola-de-lazzari - Juga jawaban Anda bekerja di Views juga. Lihat> Bidang> Tulis Ulang Hasil> Jalur tautan menerima {{ url('<current>') }}meskipun tidak tercantum di bawah Pola penggantian.
piet
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

Nitesh Sethia
sumber
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();
Rahul Baisane
sumber
7

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

Url::fromRoute('<current>',array(),array('absolute'=>'true'));
crobicha
sumber
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();
David Thomas
sumber