Как получить базовый URL сайта

34

Мой сайт находится на http: //drupal8.local/ . Как мне получить drupal8.local часть этого URL?

Url::fromRoute('<'current'>')или base_path()возвращает часть пути URL; Например, для http: //drupal8.local/a/b/c/d/e/f они возвращаются, /a/b/c/d/e/f'когда мне просто нужно получить 'drupal8.local'.

Как я могу получить эту часть URL?

Джасодип Чаттерджи
источник
2
Вы действительно имеете в виду имя хоста или базовый URL? Базовый URL может содержать части пути, когда Drupal не запускается в корневом каталоге.
mpdonadio

Ответы:

66

Вы можете получить имя хоста "drupal8.local" непосредственно из getHost()запроса:

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

В некоторых случаях вы также можете получить схему, fx https://drupal8.local:

$host = \Drupal::request()->getSchemeAndHttpHost();
Клайв
источник
36
Примечание: \Drupal::request()->getSchemeAndHttpHost()вернется http://drupal8.local.
Тим
10
Обратите внимание, что если ваш сайт находится в подпути (например, ваша домашняя страница находится на drupal8.local / uk ), это не будет возвращать подпуть. Для этого вы можете использоватьUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk
1
Upvoting комментарии от leon.nk. Url получит вам подкаталог и любой порт, если вы используете нестандартный порт. И URL заменяется на urlGenerator. Обновлен код: \ Drupal :: urlGenerator () -> generateFromRoute ('<front>', [], ['absolute' => TRUE]);
Джейсон Яррингтон
2
Запуск этого из Drush (версия 8) даст результат: по умолчанию.
Justme
1
Правильно @Justme - drush - инструмент командной строки, поэтому, естественно, нет http-хоста
Клайв
6

Есть несколько предупреждений о прямом доступе к объекту запроса следующим образом \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.

Любой контроллер формы, расширяющийся \Drupal\Core\Form\FormBaseавтоматически, имеет эту зависимость, и к нему можно получить доступ, используя:

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

Я думаю (но не проверял), что обычное расширение страницы \Drupal\Core\Controller\ControllerBaseможет предоставить request_stackсервис, переопределив \Drupal\Core\Controller\ControllerBase::createфункцию, а затем установив $requestсвойство в конструкторе. Это очень хорошо описано для форм, и тот же процесс должен применяться для контроллеров страниц: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a- форма .

Шон Дычко
источник
4

Принимая во внимание « предупреждения о прямом доступе к объекту запроса таким образом в \ Drupal :: request », о которых упоминал Шон Дычко , возможно, хорошим вариантом для получения имени хоста является получение его из глобальной переменной $ base_url с помощью php функция parse_url :

global $base_url;
$base_url_parts = parse_url($base_url);
$host = $base_url_parts['host'];
camilo.escobar
источник
1

Если вы хотите сделать это с помощью внедрения зависимостей и службы, вы можете использовать RequestStack :

use Symfony\Component\HttpFoundation\RequestStack;

И определите это так:

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

А затем объявите это так:

$this->request->getHost()
$this->request->getSchemeAndHttpHost()
Keven
источник