My site is on http://drupal8.local/. How do I get the drupal8.local part of that URL?
Url::fromRoute('<'current'>')
or base_path()
returns the path parth of the URL; For example, for http://drupal8.local/a/b/c/d/e/f, they return '/a/b/c/d/e/f'
when I just need to get 'drupal8.local'
.
How can I get that part of the URL?
- 2Do you actually mean hostname or base URL? The base URL can include path portions when Drupal isn't run in the root directory. – mpdonadio♦ Jun 1 '16 at 15:25
You can get the hostname, "drupal8.local", directly from the getHost()
request:
$host = \Drupal::request()->getHost();
In some cases you might want to get the schema as well, fx https://drupal8.local
:
$host = \Drupal::request()->getSchemeAndHttpHost();
- 36Note:
\Drupal::request()->getSchemeAndHttpHost()
will returnhttp://drupal8.local
. – Tim Nov 22 '16 at 14:54 - 9Note if your site is on a subpath (e.g. your homepage is on drupal8.local/uk), this will not return the subpath. To do this you can use
Url::fromRoute('<front>', [], ['absolute' => TRUE]);
– leon.nk Oct 5 '17 at 12:42 - 1Upvoting comments from leon.nk. Url is going to get you the sub directory and any port if you are on a non-standard port. And, Url is replaced by urlGenerator. Updated code is: \Drupal::urlGenerator()->generateFromRoute('<front>', [], ['absolute' => TRUE]); – Jason Yarrington May 9 '18 at 16:02
- 1Correct @Justme - drush is a command line tool so naturally there’s no http host – Clive♦ May 28 '18 at 13:14
- 1
There are some warnings about directly accessing the request object in this way in \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.
Any form controller extending \Drupal\Core\Form\FormBase
automatically has this dependency injected, and it may be accessed using:
$this->getRequest()->getSchemeAndHttpHost()
I think (but haven't tested) that a regular page controller extending \Drupal\Core\Controller\ControllerBase
could provide the request_stack
service by overriding the \Drupal\Core\Controller\ControllerBase::create
function, and then setting a $request
property in the constructor. This is described really well for forms, and the same process should apply for page controllers: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a-form.
Taking into account the "warnings about directly accessing the request object in this way in \Drupal::request" that Shaun Dychko mentioned, perhaps a good option to get the hostname is obtain it from the $base_url global variable, with the help of php function parse_url:
global $base_url;
$base_url_parts = parse_url($base_url);
$host = $base_url_parts['host'];