วิธีรับ URL ฐานของไซต์


34

เว็บไซต์ของฉันอยู่บนhttp: //drupal8.local/ ฉันจะรับdrupal8.localส่วนหนึ่งของ URL นั้นได้อย่างไร

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 ไม่ทำงานในไดเรกทอรีราก
mpdonadio

คำตอบ:


66

คุณสามารถรับชื่อโฮสต์ "drupal8.local" โดยตรงจากgetHost()คำขอ:

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

ในบางกรณีคุณอาจต้องการรับ schema ด้วย fx https://drupal8.local:

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

36
หมายเหตุ: จะกลับมา\Drupal::request()->getSchemeAndHttpHost() http://drupal8.local
ทิม

10
หมายเหตุหากเว็บไซต์ของคุณอยู่ในพา ธ ย่อย (เช่นหน้าแรกของคุณอยู่ในdrupal8.local / uk ) สิ่งนี้จะไม่ส่งคืน subpath ในการทำเช่นนี้คุณสามารถใช้Url::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk

1
การอัพโหลดความคิดเห็นจาก leon.nk Url จะทำให้คุณได้รับไดเรกทอรีย่อยและพอร์ตใด ๆ หากคุณอยู่ในพอร์ตที่ไม่ได้มาตรฐาน และ Url จะถูกแทนที่ด้วย urlGenerator รหัสที่ได้รับการปรับปรุงคือ: \ Drupal :: urlGenerator () -> generateFromRoute ('<front>', [], ['absolute' => TRUE]);
Jason Yarrington

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\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

คำนึงถึง " คำเตือนเกี่ยวกับการเข้าถึงวัตถุคำขอโดยตรงด้วยวิธีนี้ใน \ Drupal :: request " ที่ Shaun Dychkoพูดถึงบางทีตัวเลือกที่ดีในการรับชื่อโฮสต์นั้นได้มาจากตัวแปรโกลบอล$ base_urlด้วยความช่วยเหลือของ php ฟังก์ชั่น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.