Cách lấy URL cơ sở của trang web


34

Trang web của tôi trên http: //drupal8.local/ . Làm cách nào để có được phần drupal8.local của URL đó?

Url::fromRoute('<'current'>')hoặc base_path()trả về parth đường dẫn của URL; Ví dụ: đối với http: //drupal8.local/a/b/c/d/e/f , họ sẽ quay lại ' /a/b/c/d/e/f'khi tôi chỉ cần lấy 'drupal8.local'.

Làm cách nào tôi có thể có được một phần của URL?


2
Bạn thực sự có nghĩa là tên máy chủ hoặc URL cơ sở? URL cơ sở có thể bao gồm các phần đường dẫn khi Drupal không chạy trong thư mục gốc.
mpdon Arena

Câu trả lời:


66

Bạn có thể lấy tên máy chủ, "drupal8.local", trực tiếp từ getHost()yêu cầu:

$host = \Drupal::request()->getHost();

Trong một số trường hợp, bạn cũng có thể muốn lấy lược đồ, fx https://drupal8.local:

$host = \Drupal::request()->getSchemeAndHttpHost();

36
Lưu ý: \Drupal::request()->getSchemeAndHttpHost()sẽ trở lại http://drupal8.local.
Tim

10
Lưu ý nếu trang web của bạn nằm trên đường dẫn phụ (ví dụ: trang chủ của bạn nằm trên drupal8.local / uk ), điều này sẽ không trả về đường dẫn phụ. Để làm điều này, bạn có thể sử dụngUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk

1
Nâng cao ý kiến ​​từ leon.nk. Url sẽ giúp bạn có thư mục con và bất kỳ cổng nào nếu bạn ở trên một cổng không chuẩn. Và, Url được thay thế bởi urlGenerator. Mã được cập nhật là: \ Drupal :: urlGenerator () -> createdFromRoute ('<front>', [], ['perfect' => TRUE]);
Jason Yarrington

2
Chạy nó từ Drush (phiên bản 8), điều này sẽ cho kết quả: Mặc định.
Justme

1
Đúng @Justme - drush là một công cụ dòng lệnh nên đương nhiên không có máy chủ http
Clive

6

Có một số cảnh báo về việc truy cập trực tiếp vào đối tượng yêu cầu theo cách này trong \Drupal::request:

 * Note: The use of this wrapper in particular is especially discouraged. Most
 * code should not need to access the request directly.  Doing so means it
 * will only function when handling an HTTP request, and will require special
 * modification or wrapping when run from a command line tool, from certain
 * queue processors, or from automated tests.
 *
 * If code must access the request, it is considerably better to register
 * an object with the Service Container and give it a setRequest() method
 * that is configured to run when the service is created.  That way, the
 * correct request object can always be provided by the container and the
 * service can still be unit tested.

Bất kỳ bộ điều khiển biểu mẫu nào \Drupal\Core\Form\FormBasetự động mở rộng đều có phần phụ thuộc này được chèn và nó có thể được truy cập bằng cách sử dụng:

$this->getRequest()->getSchemeAndHttpHost()

Tôi nghĩ (nhưng chưa được kiểm tra) rằng một bộ điều khiển trang thông thường mở rộng \Drupal\Core\Controller\ControllerBasecó thể cung cấp request_stackdịch vụ bằng cách ghi đè \Drupal\Core\Controller\ControllerBase::createchức năng và sau đó đặt $requestthuộc tính trong hàm tạo. Điều này được mô tả thực sự tốt cho các biểu mẫu và quy trình tương tự sẽ được áp dụng cho các bộ điều khiển trang: https://www.drupal.org/docs/8/api/service-and-dependency-injection/dependency-injection-for-a- hình thức .


4

Có tính đến " các cảnh báo về việc truy cập trực tiếp vào đối tượng yêu cầu theo cách này trong \ Drupal :: request " mà Shaun Dychko đã đề cập, có lẽ một lựa chọn tốt để có được tên máy chủ là lấy từ biến toàn cầu $ base_url , với sự trợ giúp của php hàm parse_url :

global $base_url;
$base_url_parts = parse_url($base_url);
$host = $base_url_parts['host'];

1

Nếu bạn muốn làm điều này với tiêm phụ thuộc và dịch vụ, thì bạn có thể sử dụng RequestStack :

use Symfony\Component\HttpFoundation\RequestStack;

Và định nghĩa nó như thế này:

protected $request;

public function __construct(..., RequestStack $request_stack) {
  ...
  $this->request = $request_stack->getCurrentRequest();
}

public static function create(ContainerInterface $container, ...) {
  return new static(
    ...
    $container->get('request_stack')
  )
}

Và sau đó tuyên bố nó như thế này:

$this->request->getHost()
$this->request->getSchemeAndHttpHost()
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.