Bir sitenin temel URL’si nasıl alınır


34

Sitem http: //drupal8.local/ adresindedir . Bu URL’nin drupal8.local bölümünü nasıl edinebilirim ?

Url::fromRoute('<'current'>')veya base_path()URL'nin yolunu parth döndürür; Örneğin, http: //drupal8.local/a/b/c/d/e/f için , /a/b/c/d/e/f'sadece almam gerektiğinde 'dönerler 'drupal8.local'.

URL’nin bu bölümünü nasıl alabilirim?


2
Ana bilgisayar adı veya temel URL mi demek istiyorsunuz? Temel URL, Drupal kök dizinde çalıştırılmadığında yol bölümleri içerebilir.
mpdonadio

Yanıtlar:


66

"Drupal8.local" ana bilgisayar adını doğrudan getHost()istekten alabilirsiniz:

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

Bazı durumlarda şemayı da almak isteyebilirsiniz, fx https://drupal8.local:

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

36
Not: \Drupal::request()->getSchemeAndHttpHost()geri dönecek http://drupal8.local.
Tim

10
Siteniz bir alt yoldaysa (örneğin, ana sayfanız drupal8.local / uk adresinde ise ), bu alt yolu döndürmez. Bunu yapmak için kullanabilirsinizUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk

1
Leon.nk sitesinden gelen yorumlar. URL, standart olmayan bir bağlantı noktasındaysanız, alt dizini ve herhangi bir bağlantı noktasını alır. Ve, URL urlGenerator ile değiştirilir. Güncellenen kod: \ Drupal :: urlGenerator () -> construcFromRoute ('<front>', [], ['absolute' => TRUE]);
Jason Yarrington,

2
Bunu Drush'tan çalıştırmak (sürüm 8) bu bir sonuç verecektir: Varsayılan.
Justme

1
Doğru @Justme - drush bir komut satırı aracıdır, bu yüzden doğal olarak hiçbir http hostu yoktur
Clive

6

İstek nesnesine doğrudan bu şekilde erişme konusunda bazı uyarılar vardır \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\FormBaseOtomatik olarak uzanan herhangi bir form denetleyicisine bu bağımlılık enjekte edilir ve aşağıdakiler kullanılarak erişilebilir:

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

Genişleyen normal bir sayfa denetleyicisinin , işlevi geçersiz kılarak ve ardından yapıcıda bir özellik ayarlayarak hizmeti \Drupal\Core\Controller\ControllerBasesağlayabileceğini düşünüyorum (ancak test etmedim) . Bu, formlar için gerçekten iyi tanımlanmıştır ve aynı işlem sayfa denetleyicileri için de geçerlidir: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a- oluştururlar .request_stack\Drupal\Core\Controller\ControllerBase::create$request


4

Shaun Dychko'nun belirttiği " istek nesnesine bu şekilde doğrudan erişme konusunda \ Drupal :: request " ile ilgili uyarılar dikkate alındığında , belki de ana bilgisayar adını almak için iyi bir seçenek $ base_url global değişkeninden php yardımıyla elde edilir. parse_url işlevi :

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

1

Bunu bağımlılık enjeksiyonu ve servisle yapmak isterseniz, RequestStack'ı kullanabilirsiniz :

use Symfony\Component\HttpFoundation\RequestStack;

Ve bunu şöyle tanımlayın:

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

Ve sonra böyle ilan:

$this->request->getHost()
$this->request->getSchemeAndHttpHost()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.