किसी साइट का आधार 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
क्या आप वास्तव में hostname या आधार URL का मतलब है? मूल निर्देशिका में Drupal नहीं चलने पर बेस URL में पथ भाग शामिल हो सकते हैं।
mpdonadio

जवाबों:


66

आप getHost()अनुरोध से सीधे hostname, "drupal8.local" प्राप्त कर सकते हैं :

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

कुछ मामलों में आप स्कीमा भी प्राप्त करना चाहते हैं, fx https://drupal8.local:

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

36
नोट: \Drupal::request()->getSchemeAndHttpHost()वापस आ जाएगी http://drupal8.local
टिम

10
ध्यान दें कि यदि आपकी साइट उपपथ पर है (जैसे आपका मुखपृष्ठ drupal8.local / uk पर है ), तो यह उपपथ वापस नहीं आएगा। ऐसा करने के लिए आप उपयोग कर सकते हैंUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk

1
Leon.nk से टिप्पणियां प्राप्त करना यदि आप एक गैर-मानक पोर्ट पर हैं, तो Url आपको उप निर्देशिका और कोई भी पोर्ट मिलने वाला है। और, Url को urlGenerator द्वारा बदल दिया जाता है। अद्यतित कोड है: \ Drupal :: urlGenerator () -> generateFromRoute ('<सामने>', [], ['निरपेक्ष' => TRUE]);
जेसन यारिंगटन

2
Drush (संस्करण 8) से इसे चलाने पर यह एक परिणाम देगा: डिफ़ॉल्ट।
Justme

1
सही @Justme - Drush एक कमांड लाइन उपकरण इसलिए स्वाभाविक रूप से वहाँ कोई http मेजबान है
क्लाइव

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प्रदान कर सकता है । यह रूपों के लिए वास्तव में अच्छी तरह से वर्णित है, और पेज नियंत्रकों के लिए एक ही प्रक्रिया लागू होनी चाहिए: https://www.drupal.org/docs/8/api/services-and-d dependency- injection/ dependency- injection-for- a- रूपrequest_stack\Drupal\Core\Controller\ControllerBase::create$request


4

" Drupal :: request " में इस तरह से अनुरोध ऑब्जेक्ट को सीधे एक्सेस करने के बारे में चेतावनी को ध्यान में रखते हुए , शॉन डिकको ने उल्लेख किया, शायद होस्टनाम प्राप्त करने का एक अच्छा विकल्प इसे $ 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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.