サイトのベースURLを取得する方法


34

私のサイトはhttp://drupal8.local/にあります。そのURLのdrupal8.local部分を取得するにはどうすればよいですか?

Url::fromRoute('<'current'>')またはbase_path()、URLのパス部分を返します。たとえば、http://drupal8.local/a/b/c/d/e/f/a/b/c/d/e/f'場合、単に取得する必要があるときに'を返します'drupal8.local'

URLのその部分を取得するにはどうすればよいですか?


2
実際にホスト名またはベースURLを意味しますか?ルートURLでDrupalが実行されていない場合、ベースURLにパス部分を含めることができます。
mpdonadio

回答:


66

ホスト名「drupal8.local」をgetHost()リクエストから直接取得できます。

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

場合によっては、スキーマfxも取得する必要がありますhttps://drupal8.local

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

36
注:\Drupal::request()->getSchemeAndHttpHost()を返しhttp://drupal8.localます。
ティム

10
サイトがサブパス上にある場合(たとえば、ホームページがdrupal8.local / ukにある場合)、これはサブパスを返しません。これを行うには、次を使用できますUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk

1
leon.nkからのコメントを支持します。非標準のポートを使用している場合、Urlはサブディレクトリと任意のポートを取得します。また、UrlはurlGeneratorに置き換えられます。更新されたコード:\ Drupal :: urlGenerator()-> generateFromRoute( '<front>'、[]、['absolute' => TRUE]);
ジェイソンヤリントン

2
これをDrush(バージョン8)から実行すると、デフォルトの結果が得られます。
-Justme

1
正しい@Justme-drushはコマンドラインツールであるため、当然httpホストはありません
Clive

6

この方法でリクエストオブジェクトに直接アクセスすることに関するいくつかの警告があります\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\FormBase自動的に拡張されるすべてのフォームコントローラーには、この依存関係が挿入され、以下を使用してアクセスできます。

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

通常のページコントローラーの拡張\Drupal\Core\Controller\ControllerBaserequest_stack\Drupal\Core\Controller\ControllerBase::create関数をオーバーライド$requestし、コンストラクターでプロパティを設定することでサービスを提供できると思います(ただし、テストしていません)。これはフォームについて非常によく説明されており、ページコントローラーにも同じプロセスが適用されるはずです:https : //www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a-フォーム


4

Shaun Dychkoが言及した「この方法で\ Drupal :: requestでリクエストオブジェクトに直接アクセスすることに関する警告」を考慮して、おそらくホスト名を取得するための適切なオプションは、phpの助けを借りて$ base_urlグローバル変数から取得することです関数parse_url

global $base_url;
$base_url_parts = parse_url($base_url);
$host = $base_url_parts['host'];

1

依存性注入とサービスを使用してこれを行いたい場合は、RequestStackを使用できます。

use Symfony\Component\HttpFoundation\RequestStack;

そして、次のように定義します:

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

そして、次のように宣言します:

$this->request->getHost()
$this->request->getSchemeAndHttpHost()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.