Jak uzyskać podstawowy adres URL witryny

34

Moja strona znajduje się na http: //drupal8.local/ . Jak uzyskać część drupal8.local tego adresu URL?

Url::fromRoute('<'current'>')lub base_path()zwraca część parth adresu URL; Na przykład dla http: //drupal8.local/a/b/c/d/e/f zwracają „, /a/b/c/d/e/f'gdy tylko muszę to uzyskać 'drupal8.local'.

Jak mogę uzyskać tę część adresu URL?

Jasodeep Chatterjee
źródło
2
Czy faktycznie masz na myśli nazwę hosta lub podstawowy adres URL? Podstawowy adres URL może zawierać części ścieżki, gdy Drupal nie jest uruchomiony w katalogu głównym.
mpdonadio

Odpowiedzi:

66

Możesz uzyskać nazwę hosta „drupal8.local” bezpośrednio z getHost()żądania:

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

W niektórych przypadkach możesz również chcieć uzyskać schemat, fx https://drupal8.local:

$host = \Drupal::request()->getSchemeAndHttpHost();
Clive
źródło
36
Uwaga: \Drupal::request()->getSchemeAndHttpHost()wróci http://drupal8.local.
Tim
10
Uwaga: jeśli twoja strona znajduje się na podścieżce (np. Twoja strona główna znajduje się na drupal8.local / uk ), to nie zwróci podścieżki. Aby to zrobić, możesz użyćUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk
1
Pozytywne komentarze z leon.nk. Url dostarczy ci podkatalog i dowolny port, jeśli korzystasz z niestandardowego portu. I URL jest zastąpiony przez urlGenerator. Zaktualizowany kod to: \ Drupal :: urlGenerator () -> generateFromRoute ('<front>', [], ['bezwzględny' => PRAWDA]);
Jason Yarrington,
2
Uruchomienie tego z Drusha (wersja 8) da wynik: Domyślny.
Justme
1
Prawidłowo @Justme - drush jest narzędziem wiersza poleceń, więc naturalnie nie ma hosta http
Clive
6

Istnieją pewne ostrzeżenia dotyczące bezpośredniego dostępu do obiektu żądania w ten sposób w \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.

Każdy kontroler formularzy rozszerzający się \Drupal\Core\Form\FormBaseautomatycznie ma wstrzykiwaną tę zależność i można uzyskać do niego dostęp za pomocą:

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

Myślę (ale nie przetestowałem), że zwykłe rozszerzenie kontrolera strony \Drupal\Core\Controller\ControllerBasemoże zapewnić request_stackusługę, zastępując \Drupal\Core\Controller\ControllerBase::createfunkcję, a następnie ustawiając $requestwłaściwość w konstruktorze. Jest to bardzo dobrze opisane dla formularzy i ten sam proces powinien mieć zastosowanie do kontrolerów stron: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a- tworzą .

Shaun Dychko
źródło
4

Biorąc pod uwagę „ ostrzeżenia o bezpośrednim dostępie do obiektu żądania w ten sposób w \ Drupal :: request ”, o których wspomniał Shaun Dychko , być może dobrą opcją uzyskania nazwy hosta jest uzyskanie jej ze zmiennej globalnej $ base_url za pomocą php funkcja parse_url :

global $base_url;
$base_url_parts = parse_url($base_url);
$host = $base_url_parts['host'];
camilo.escobar
źródło
1

Jeśli chcesz to zrobić za pomocą wstrzykiwania zależności i usługi, możesz użyć RequestStack :

use Symfony\Component\HttpFoundation\RequestStack;

I zdefiniuj to w następujący sposób:

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')
  )
}

A następnie zadeklaruj to w ten sposób:

$this->request->getHost()
$this->request->getSchemeAndHttpHost()
Keven
źródło