Come ottenere l'URL di base di un sito


34

Il mio sito è su http: //drupal8.local/ . Come ottengo la parte drupal8.local di quell'URL ?

Url::fromRoute('<'current'>')o base_path()restituisce il percorso in base all'URL; Ad esempio, per http: //drupal8.local/a/b/c/d/e/f , restituiscono ' /a/b/c/d/e/f'quando ho solo bisogno di ottenere 'drupal8.local'.

Come posso ottenere quella parte dell'URL?


2
Intendi davvero nome host o URL di base? L'URL di base può includere porzioni di percorso quando Drupal non viene eseguito nella directory principale.
mpdonadio

Risposte:


66

È possibile ottenere il nome host "drupal8.local" direttamente dalla getHost()richiesta:

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

In alcuni casi potresti voler ottenere anche lo schema, fx https://drupal8.local:

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

36
Nota: \Drupal::request()->getSchemeAndHttpHost()tornerà http://drupal8.local.
Tim

10
Nota se il tuo sito si trova su un sottotraccia (ad es. La tua homepage è su drupal8.local / uk ), questo non restituirà il sottotracciato. Per fare questo puoi usareUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk il

1
Aggiornamento dei commenti da leon.nk. Url ti procurerà la sottodirectory e qualsiasi porta se ti trovi su una porta non standard. E, Url è sostituito da urlGenerator. Il codice aggiornato è: \ Drupal :: urlGenerator () -> generateFromRoute ('<front>', [], ['absolute' => TRUE]);
Jason Yarrington

2
Eseguendolo da Drush (versione 8), si otterrà un risultato: impostazione predefinita.
Justme,

1
Corretto @Justme - drush è uno strumento da riga di comando, quindi naturalmente non esiste un host http
Clive

6

Esistono alcuni avvisi sull'accesso diretto all'oggetto richiesta in questo modo in \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.

A qualsiasi controller di modulo che si estende \Drupal\Core\Form\FormBaseautomaticamente viene iniettata questa dipendenza e è possibile accedervi utilizzando:

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

Penso (ma non ho testato) che una normale estensione del controller di pagina \Drupal\Core\Controller\ControllerBasepotrebbe fornire il request_stackservizio sovrascrivendo la \Drupal\Core\Controller\ControllerBase::createfunzione e quindi impostando una $requestproprietà nel costruttore. Questo è descritto molto bene per i moduli e lo stesso processo dovrebbe valere per i controller di pagina: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a- modulo .


4

Tenendo conto degli " avvertimenti sull'accesso diretto all'oggetto richiesta in questo modo in \ Drupal :: request " di cui parla Shaun Dychko , forse una buona opzione per ottenere il nome host è ottenerlo dalla variabile globale $ base_url , con l'aiuto di php funzione parse_url :

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

1

Se desideri eseguire questa operazione con l'iniezione delle dipendenze e un servizio, puoi utilizzare RequestStack :

use Symfony\Component\HttpFoundation\RequestStack;

E definiscilo così:

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

E poi dichiaralo così:

$this->request->getHost()
$this->request->getSchemeAndHttpHost()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.