我的网站位于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的那一部分?
我的网站位于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的那一部分?
Answers:
您可以直接从getHost()
请求中获取主机名“ drupal8.local” :
$host = \Drupal::request()->getHost();
在某些情况下,您可能还希望获得模式fx https://drupal8.local
:
$host = \Drupal::request()->getSchemeAndHttpHost();
\Drupal::request()->getSchemeAndHttpHost()
将返回http://drupal8.local
。
Url::fromRoute('<front>', [], ['absolute' => TRUE]);
在以下方式中,有一些关于以这种方式直接访问请求对象的警告\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-形成。
考虑到Shaun Dychko提到的“ 关于在\ Drupal :: request中以这种方式直接访问请求对象的警告 ” ,也许要获得主机名的一个好选择是在php的帮助下从$ base_url全局变量中获取它。函数parse_url:
global $base_url;
$base_url_parts = parse_url($base_url);
$host = $base_url_parts['host'];
如果您想通过依赖注入和服务来做到这一点,那么可以使用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()