Làm thế nào để tôi có được bí danh hoặc đường dẫn hiện tại?


56

Làm cách nào tôi có thể có được bí danh và / hoặc đường dẫn hiện tại trong Drupal 8?

Trong Drupal 7 tôi đã làm điều này với drupal_get_path_alias(). Mã tương đương tôi nên sử dụng trong Drupal 8 là gì?

Câu trả lời:


108

Một số câu trả lời khác chỉ đúng trong các phiên bản alpha / beta trước đây của Drupal 8, hoặc dường như chưa hoàn chỉnh. Kể từ phiên bản beta7 (và hy vọng là vĩnh viễn), nên áp dụng các quy tắc sau:

Đối với đường dẫn thô hiện tại (đường dẫn Drupal không bí danh):

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

Đối với URI hiện tại , phần lớn đại diện trực tiếp cho yêu cầu (thậm chí có thể bao gồm chuỗi truy vấn):

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

Tất nhiên không có gì đảm bảo rằng $current_urigiá trị này sẽ cung cấp cho bạn một bí danh, ngay cả khi có sẵn cho yêu cầu, vì nó chỉ đại diện cho những gì người dùng đã yêu cầu. Vì vậy, để thực hiện nghiêm túc những gì bạn đang yêu cầu (lấy bí danh nếu có, và đường dẫn nếu không) Tôi nghĩ bạn có thể làm:

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

Tất nhiên tùy thuộc vào loại xử lý bạn đang thực hiện, có thể tốt nhất là làm việc với các tuyến đường thay vì đường dẫn, nhưng tôi cho rằng đó là một chủ đề hoàn toàn khác.


Tại sao bạn đề cập rằng sẽ tốt hơn khi sử dụng các tuyến đường thay vì các đường dẫn? Bạn có thể cung cấp một ví dụ / lý do ngắn gọn?
itdarrylnorris

@ darol100, tôi có thể không phải là người tốt nhất để cung cấp câu trả lời toàn diện cho điều đó, nhưng tôi có thể nói với bạn rằng việc sử dụng các đường dẫn để tạo URL lập trình được chính thức khấu hao trong Drupal 8 - xem: drupal.org/node/2046643 . Các tuyến Symfony cung cấp một cách mạnh mẽ hơn để ánh xạ tài nguyên độc lập với các cấu trúc đường dẫn (nếu bạn xây dựng liên kết bằng các tuyến, liên kết đó sẽ tiếp tục hoạt động ngay cả khi đường dẫn / mẫu URL thay đổi).
rjacobs

Chỉ cần một lưu ý rằng ::getAliasByPath()sẽ không còn chấp nhận một chuỗi đường dẫn mà không có dấu gạch chéo hàng đầu (kể từ phiên bản beta13 tôi tin).
othermachines

5
getAliasByPathkhông trả về đường dẫn mà không có tiền tố ngôn ngữ. Bất kỳ ý tưởng làm thế nào để giải quyết điều này?
Philipp Michael

1
những gì về từ trong một mẫu twig?
ĂN

35

Cách thích hợp cho URL mà không có bí danh URL.

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

\Drupal::request()->getRequestUri();tôn trọng cài đặt Drupal trong thư mục con không?
Brian

Làm thế nào tôi có thể làm điều đó cho một con đường không hiện tại? Có cách nào để lấy nó từ chỉ một chuỗi không?
BrandenB171

Làm thế nào để tôi có được đường dẫn tuyệt đối, chẳng hạn như thế này: mydrupalsite.org/node/123 ?
mcaleaa

1
toàn cầu $ base_root; $ current_uri = \ Drupal :: request () -> getRequestUri (); $ current_path = $ base_root. $ current_uri;
oknate

18

Trong Drupal 8, bạn có thể làm điều này với Twig:

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

thí dụ:

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

từ: https://www.drupal.org/docs/8/theming/twig/fifts-in-twig-temsheet


1
Great find @ nicola-de-lazzari - Ngoài ra câu trả lời của bạn cũng hoạt động trong Lượt xem. Xem> Trường> Viết lại kết quả> Đường dẫn liên kết chấp nhận {{ url('<current>') }}ngay cả khi không được liệt kê trong Mẫu thay thế.
piet

16

Để có được đường dẫn hiện tại trong Drupal 7, bạn sử dụng để sử dụng current_path(), nhưng trong Drupal 8 bạn sử dụng $url = Url::fromRoute('<current>');.

Nguồn: https://www.drupal.org/node/2382211


current_path()drupal_get_path_alias()chúng là các chức năng khác nhau.
itdarrylnorris

Đây sẽ là câu trả lời vì phiên bản này đưa ra đường dẫn với tiền tố ngôn ngữ.
Guillaume Bois

OP đang yêu cầu D8 tương đương với drupal_get_path_alias (). Bạn đang trả về đường dẫn hiện tại và KHÔNG phải là đường dẫn bí danh từ nút D7 '/'.$ nid
macjules

9

Để có được đường dẫn hiện tại (đường dẫn bí danh):

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

Để có được đường dẫn hiện tại (đường dẫn hệ thống):

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

7

Đối với Drupal 8, đây là giải pháp sạch nhất tôi có thể tìm thấy:

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

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


2

Nếu bạn cũng muốn URL tuyệt đối với chuỗi truy vấn:

use Drupal\Core\Url;
// ...
Url::fromRoute('<current>', [], ['query' => \Drupal::request()->query->all(), 'absolute' => 'true'])->toString();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.