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?
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();
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 .
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'];
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()