Cara mendapatkan URL dasar suatu situs

34

Situs saya ada di http: //drupal8.local/ . Bagaimana saya mendapatkan bagian drupal8.local dari URL itu?

Url::fromRoute('<'current'>')atau base_path()mengembalikan bagian path dari URL; Misalnya, untuk http: //drupal8.local/a/b/c/d/e/f , mereka mengembalikan ' /a/b/c/d/e/f'ketika saya hanya perlu mendapatkannya 'drupal8.local'.

Bagaimana saya bisa mendapatkan bagian dari URL itu?

Jasodeep Chatterjee
sumber
2
Apakah maksud Anda sebenarnya hostname atau URL dasar? URL dasar dapat menyertakan bagian jalur ketika Drupal tidak berjalan di direktori root.
mpdonadio

Jawaban:

66

Anda bisa mendapatkan nama host, "drupal8.local", langsung dari getHost()permintaan:

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

Dalam beberapa kasus Anda mungkin ingin mendapatkan skema juga, fx https://drupal8.local:

$host = \Drupal::request()->getSchemeAndHttpHost();
Clive
sumber
36
Catatan: \Drupal::request()->getSchemeAndHttpHost()akan kembali http://drupal8.local.
Tim
10
Perhatikan jika situs Anda berada di subpath (mis. Beranda Anda di drupal8.local / uk ), ini tidak akan mengembalikan subpath. Untuk melakukan ini, Anda dapat menggunakanUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk
1
Memvotasikan komentar dari leon.nk. Url akan memberi Anda sub direktori dan port apa pun jika Anda menggunakan port non-standar. Dan, Url digantikan oleh urlGenerator. Kode yang diperbarui adalah: \ Drupal :: urlGenerator () -> generateFromRoute ('<front>', [], ['absolute' => TRUE]);
Jason Yarrington
2
Menjalankan ini dari Drush (versi 8) ini akan memberikan hasil: Default.
Justme
1
Benar @Justme - drush adalah alat baris perintah jadi secara alami tidak ada host http
Clive
6

Ada beberapa peringatan tentang secara langsung mengakses objek permintaan dengan cara ini di \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.

Setiap pengontrol formulir yang diperpanjang \Drupal\Core\Form\FormBasesecara otomatis memiliki ketergantungan ini disuntikkan, dan dapat diakses menggunakan:

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

Saya pikir (tetapi belum diuji) bahwa perpanjangan pengontrol halaman biasa \Drupal\Core\Controller\ControllerBasedapat menyediakan request_stacklayanan dengan mengesampingkan \Drupal\Core\Controller\ControllerBase::createfungsi, dan kemudian menetapkan $requestproperti di konstruktor. Ini dijelaskan dengan sangat baik untuk formulir, dan proses yang sama harus berlaku untuk pengontrol halaman: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a- bentuk .

Shaun Dychko
sumber
4

Memperhatikan " peringatan tentang langsung mengakses objek permintaan dengan cara ini di \ Drupal :: request " yang disebutkan Shaun Dychko , mungkin opsi yang baik untuk mendapatkan nama host diperoleh dari variabel global $ base_url , dengan bantuan php fungsi parse_url :

global $base_url;
$base_url_parts = parse_url($base_url);
$host = $base_url_parts['host'];
camilo.escobar
sumber
1

Jika Anda ingin melakukan ini dengan injeksi dependensi dan layanan, maka Anda dapat menggunakan RequestStack :

use Symfony\Component\HttpFoundation\RequestStack;

Dan definisikan seperti ini:

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

Dan kemudian nyatakan seperti ini:

$this->request->getHost()
$this->request->getSchemeAndHttpHost()
Keven
sumber