Як отримати базову 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
Оголошення коментарів від leon.nk. Url збирається отримати підкаталог та будь-який порт, якщо ви знаходитесь на нестандартному порту. І, Url замінюється urlGenerator. Оновлений код: \ Drupal :: urlGenerator () -> generatorFromRoute ('<передня частина', [], ['абсолютна' => ІСТИНА]);
Джейсон Ярінгтон

2
Запустивши це з Drush (версія 8), це дасть результат: За замовчуванням.
Justme

1
Правильно @Justme - drush - це інструмент командного рядка, тому, природно, немає хоста http
Clive

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'];

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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.