it-swarm-vi.com

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

Trang web của tôi là trên http: //drupal8.local/ . Làm cách nào để tôi 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ọ trả về '/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?

38
Jasodeep Chatterjee

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

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

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

$Host = \Drupal::request()->getSchemeAndHttpHost();
74
Clive

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 mở rộng \Drupal\Core\Form\FormBase tự động được chèn phụ thuộc này và 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 bộ điều khiển trang thông thường mở rộng \Drupal\Core\Controller\ControllerBase có thể cung cấp request_stack dịch vụ bằng cách ghi đè \Drupal\Core\Controller\ControllerBase::create chức năng và sau đó đặt $request thuộ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- cho dạng a .

6
Shaun Dychko

Có tính đến "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" that Shaun Dychko đã đề cập, có lẽ một tùy chọn tốt để có được tên máy chủ là lấy nó từ $ base_url biến toàn cục, với sự trợ giúp của hàm php parse_url:

global $base_url;
$base_url_parts = parse_url($base_url);
$Host = $base_url_parts['Host'];
5
camilo.escobar

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()
2
Keven