Comment obtenir l'URL de base d'un site

34

Mon site est sur http: //drupal8.local/ . Comment obtenir la partie drupal8.local de cette URL?

Url::fromRoute('<'current'>')ou base_path()renvoie le chemin parth de l'URL; Par exemple, pour http: //drupal8.local/a/b/c/d/e/f , ils reviennent « /a/b/c/d/e/f'lorsque j'ai juste besoin d'obtenir 'drupal8.local'.

Comment puis-je obtenir cette partie de l'URL?

Jasodeep Chatterjee
la source
2
Voulez-vous dire réellement le nom d'hôte ou l'URL de base? L'URL de base peut inclure des portions de chemin lorsque Drupal n'est pas exécuté dans le répertoire racine.
mpdonadio

Réponses:

66

Vous pouvez obtenir le nom d'hôte "drupal8.local" directement à partir de la getHost()requête:

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

Dans certains cas, vous voudrez peut-être aussi obtenir le schéma, fx https://drupal8.local:

$host = \Drupal::request()->getSchemeAndHttpHost();
Clive
la source
36
Note: \Drupal::request()->getSchemeAndHttpHost()reviendra http://drupal8.local.
Tim
10
Notez que si votre site est sur un sous-chemin (par exemple, votre page d'accueil est sur drupal8.local / uk ), le sous-chemin ne sera pas renvoyé. Pour ce faire , vous pouvez utiliserUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk
1
Upvoting comments from leon.nk. Url va vous chercher le sous-répertoire et n'importe quel port si vous êtes sur un port non standard. Et, URL est remplacé par urlGenerator. Le code mis à jour est: \ Drupal :: urlGenerator () -> generateFromRoute ('<avant>', [], ['absolu' => VRAI]);
Jason Yarrington
2
Si vous utilisez ceci depuis Drush (version 8), vous obtiendrez un résultat: Par défaut.
Justme
1
Correct @Justme - drush est un outil en ligne de commande, donc naturellement, il n'y a pas d'hôte http
Clive
6

Certains avertissements concernant l'accès direct à l'objet de requête de cette manière sont les suivants \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\FormBaseCette dépendance est automatiquement injectée dans tous les contrôleurs de formulaire se prolongeant automatiquement. Vous pouvez y accéder à l'aide de:

$this->getRequest()->getSchemeAndHttpHost()

Je pense (mais je n'ai pas testé) qu'un contrôleur de page standard extensible \Drupal\Core\Controller\ControllerBasepourrait fournir le request_stackservice en remplaçant la \Drupal\Core\Controller\ControllerBase::createfonction, puis en définissant une $requestpropriété dans le constructeur. Ceci est très bien décrit pour les formulaires et le même processus devrait s’appliquer aux contrôleurs de page: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a- forme .

Shaun Dychko
la source
4

En prenant en compte les " avertissements concernant l'accès direct à l'objet de requête de cette manière dans \ Drupal :: request " mentionnés par Shaun Dychko , une bonne option pour obtenir le nom d'hôte est de l'obtenir à partir de la variable globale $ base_url , avec l'aide de php fonction parse_url :

global $base_url;
$base_url_parts = parse_url($base_url);
$host = $base_url_parts['host'];
camilo.escobar
la source
1

Si vous souhaitez effectuer cette opération avec une injection de dépendance et un service, vous pouvez utiliser RequestStack :

use Symfony\Component\HttpFoundation\RequestStack;

Et définissez-le comme ceci:

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')
  )
}

Et puis déclarez-le comme ceci:

$this->request->getHost()
$this->request->getSchemeAndHttpHost()
Keven
la source