So erhalten Sie die Basis-URL einer Site

34

Meine Website befindet sich unter http: //drupal8.local/ . Wie erhalte ich den drupal8.local- Teil dieser URL?

Url::fromRoute('<'current'>')oder base_path()gibt den Pfadteil der URL zurück; Beispielsweise geben sie für http: //drupal8.local/a/b/c/d/e/f 'zurück, /a/b/c/d/e/f'wenn ich nur etwas brauche 'drupal8.local'.

Wie kann ich diesen Teil der URL erhalten?

Jasodeep Chatterjee
quelle
2
Meinen Sie tatsächlich den Hostnamen oder die Basis-URL? Die Basis-URL kann Pfadteile enthalten, wenn Drupal nicht im Stammverzeichnis ausgeführt wird.
mpdonadio

Antworten:

66

Sie können den Hostnamen "drupal8.local" direkt aus der getHost()Anfrage abrufen :

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

In einigen Fällen möchten Sie möglicherweise auch das Schema abrufen, fx https://drupal8.local:

$host = \Drupal::request()->getSchemeAndHttpHost();
Clive
quelle
36
Hinweis: \Drupal::request()->getSchemeAndHttpHost()wird zurückkehren http://drupal8.local.
Tim
10
Hinweis: Befindet sich Ihre Website in einem Unterpfad (z. B. befindet sich Ihre Homepage in drupal8.local / uk ), wird der Unterpfad nicht zurückgegeben. Dazu können SieUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk
1
Upvoting Kommentare von leon.nk. Mit der URL erhalten Sie das Unterverzeichnis und einen beliebigen Port, wenn Sie sich an einem nicht standardmäßigen Port befinden. Und Url wird durch urlGenerator ersetzt. Der aktualisierte Code lautet: \ Drupal :: urlGenerator () -> generateFromRoute ('<front>', [], ['absolute' => TRUE]);
Jason Yarrington
2
Wenn Sie dies von Drush (Version 8) ausführen, erhalten Sie das folgende Ergebnis: Standard.
Justme
1
Richtig @Justme - drush ist ein Kommandozeilen-Tool, daher gibt es natürlich keinen http-Host
Clive
6

Es gibt einige Warnungen bezüglich des direkten Zugriffs auf das Anforderungsobjekt auf folgende Weise \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.

In jeden Form Controller, der \Drupal\Core\Form\FormBaseautomatisch erweitert wird, wird diese Abhängigkeit eingefügt, und auf ihn kann folgendermaßen zugegriffen werden:

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

Ich denke (habe aber nicht getestet), dass eine reguläre Page-Controller-Erweiterung \Drupal\Core\Controller\ControllerBaseden request_stackDienst bereitstellen könnte, indem sie die \Drupal\Core\Controller\ControllerBase::createFunktion überschreibt und dann eine $requestEigenschaft im Konstruktor festlegt. Dies ist für Formulare sehr gut beschrieben, und der gleiche Vorgang sollte für Seitencontroller gelten: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a- bilden .

Shaun Dychko
quelle
4

Unter Berücksichtigung der " Warnungen über den direkten Zugriff auf das Anfrageobjekt auf diese Weise in \ Drupal :: request ", die Shaun Dychko erwähnte, ist es möglicherweise eine gute Option, den Hostnamen mit Hilfe von PHP aus der globalen Variablen $ base_url abzurufen Funktion parse_url :

global $base_url;
$base_url_parts = parse_url($base_url);
$host = $base_url_parts['host'];
camilo.escobar
quelle
1

Wenn Sie dies mit Abhängigkeitsinjektion und einem Service tun möchten, können Sie RequestStack verwenden :

use Symfony\Component\HttpFoundation\RequestStack;

Und definiere es so:

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

Und dann erkläre es so:

$this->request->getHost()
$this->request->getSchemeAndHttpHost()
Keven
quelle