web-dev-qa-db-ja.com

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

私のサイトは 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のその部分を取得するにはどうすればよいですか?

38

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

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

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

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

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

6
Shaun Dychko

"\ Drupal :: requestでこのようにリクエストオブジェクトに直接アクセスすることに関する警告"を考慮に入れると、Shaun Dychkoが言及され、ホスト名を取得するための適切なオプションはおそらくphp関数parse_urlを使用して$ base_urlグローバル変数から取得します。

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

依存関係の注入とサービスを使用してこれを行う場合は、 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()
2
Keven