web-dev-qa-db-fra.com

Comment obtenir l'URL de base d'un site

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 renvoient '/a/b/c/d/e/f' quand j'ai juste besoin d'obtenir 'drupal8.local'.

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

38

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

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

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

$Host = \Drupal::request()->getSchemeAndHttpHost();
74
Clive

Il existe certains avertissements concernant l'accès direct à l'objet de demande de cette manière dans \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.

Tout contrôleur de formulaire étendant \Drupal\Core\Form\FormBase a automatiquement cette dépendance injectée, et elle est accessible en utilisant:

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

Je pense (mais je n'ai pas testé) qu'un contrôleur de page standard étendant \Drupal\Core\Controller\ControllerBase pourrait fournir le request_stack service en remplaçant le \Drupal\Core\Controller\ControllerBase::create, puis en définissant une $request proprié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-form .

6
Shaun Dychko

Compte tenu des "avertissements concernant l'accès direct à l'objet de la demande de cette manière dans\Drupal :: request" que Shaun Dychko mentionné, peut-être une bonne option pour obtenir le nom d'hôte est l'obtenir à partir de la variable globale $ base_url, à l'aide de la fonction php parse_url:

global $base_url;
$base_url_parts = parse_url($base_url);
$Host = $base_url_parts['Host'];
5
camilo.escobar

Si vous souhaitez le faire avec l'injection de dépendances 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()
2
Keven