如何获取网站的基本URL


34

我的网站位于http://drupal8.local/。如何获得该URL 的drupal8.local部分?

Url::fromRoute('<'current'>')base_path()返回URL的路径parth;例如,对于http://drupal8.local/a/b/c/d/e/f/a/b/c/d/e/f'当我只需要获取时,它们将返回' 'drupal8.local'

如何获得URL的那一部分?


2
您实际上是指主机名还是基本URL?如果不在根目录中运行Drupal,则基本URL可以包含路径部分。
mpdonadio

Answers:


66

您可以直接从getHost()请求中获取主机名“ drupal8.local” :

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

在某些情况下,您可能还希望获得模式fx https://drupal8.local

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

36
注意:\Drupal::request()->getSchemeAndHttpHost()将返回http://drupal8.local
蒂姆(Tim)

10
请注意,如果您的站点位于子路径上(例如,您的主页位于drupal8.local / uk上),则此操作不会返回该子路径。为此,您可以使用Url::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk

1
来自leon.nk的评论。如果您使用的是非标准端口,URL将为您提供子目录和任何端口。并且,URL被urlGenerator代替。更新的代码是:\ Drupal :: urlGenerator()-> generateFromRoute('<front>',[],['absolute'=> TRUE]);
杰森·雅灵顿

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

考虑到Shaun Dychko提到的“ 关于在\ Drupal :: request中以这种方式直接访问请求对象的警告 ” ,也许要获得主机名的一个好选择是在php的帮助下从$ base_url全局变量中获取它。函数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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.