27

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?

                     
improve this question                            
edited Oct 12 '18 at 18:44                                
                                   
                               
leymannx                                    
7,48353063                                    
asked Jun 1 '16 at 9:25                                
                                   
                               
  • 2                                
    Do 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                                
       

3 Answers  正确答案                

activeoldestvotes                    
       
53

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();
                   
improve this answer                            
edited Mar 17 at 9:58                                
                                   
                               
Community                                    
1                                    
answered Jun 1 '16 at 9:29                                
                                   
                               
  • 36                                    
    Note: \Drupal::request()->getSchemeAndHttpHost() will return http://drupal8.local. – Tim Nov 22 '16 at 14:54                                    
  • 9                                    
    Note 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                                     
  • 1                                    
    Upvoting 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                                    
  • 1                                    
    Correct @Justme - drush is a command line tool so naturally there’s no http host – Clive May 28 '18 at 13:14                                    
  • 1                                    
    @Clive – Why not simply global $base_url? – leymannx Nov 8 '18 at 14:17                                    
       
6

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.

improve this answer                            
edited Oct 12 '18 at 17:51                                
                                   
                               
Baik Ho                                    
318214                                    
answered May 4 '17 at 13:44                                
                                   
                               
       
3

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'];
                   
improve this answer                            
answered Apr 17 '18 at 16:18                                
                                   
                               
       

来自  https://drupal.stackexchange.com/questions/202810/how-to-get-the-base-url-of-a-site