사이트의 기본 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을 의미합니까? 루트 디렉토리에서 Drupal이 실행되지 않을 때 기본 URL에 경로 부분이 포함될 수 있습니다.
mpdonadio

답변:


66

getHost()요청 에서 직접 호스트 이름 "drupal8.local"을 얻을 수 있습니다 .

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

어떤 경우에는 fx 스키마를 원할 수도 있습니다 https://drupal8.local.

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

36
참고 : \Drupal::request()->getSchemeAndHttpHost()를 반환 http://drupal8.local합니다.
Tim

10
사이트가 하위 경로에있는 경우 (예 : 홈페이지가 drupal8.local / uk에있는 경우 ) 하위 경로가 반환되지 않습니다. 이를 위해 다음을 사용할 수 있습니다Url::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk

1
leon.nk의 의견지지. 비표준 포트에 있으면 URL이 하위 디렉토리와 포트를 가져옵니다. 그리고 Url은 urlGenerator로 대체됩니다. 업데이트 된 코드는 다음과 같습니다. \ Drupal :: urlGenerator ()-> generateFromRoute ( '<front>', [], [ 'absolute'=> TRUE]);
Jason Yarrington

2
Drush (버전 8)에서 이것을 실행하면 결과가 나타납니다 : Default.
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\ControllerBase은 함수 request_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.