Como obter o URL base de um site

34

Meu site está em http: //drupal8.local/ . Como obtenho a parte drupal8.local desse URL?

Url::fromRoute('<'current'>')ou base_path()retorna o caminho do URL; Por exemplo, para http: //drupal8.local/a/b/c/d/e/f , eles retornam ' /a/b/c/d/e/f'quando eu só preciso obter 'drupal8.local'.

Como posso obter essa parte do URL?

Jasodeep Chatterjee
fonte
2
Você realmente quer dizer nome do host ou URL base? O URL base pode incluir partes do caminho quando o Drupal não é executado no diretório raiz.
mpdonadio

Respostas:

66

Você pode obter o nome do host "drupal8.local" diretamente da getHost()solicitação:

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

Em alguns casos, você também pode querer obter o esquema, fx https://drupal8.local:

$host = \Drupal::request()->getSchemeAndHttpHost();
Clive
fonte
36
Nota: \Drupal::request()->getSchemeAndHttpHost()retornará http://drupal8.local.
Tim
10
Observe que se o seu site estiver em um subcaminho (por exemplo, sua página inicial está em drupal8.local / uk ), isso não retornará o subcaminho. Para fazer isso você pode usarUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk
1
Comentários preliminares de leon.nk. O URL fornecerá o subdiretório e qualquer porta, se você estiver em uma porta não padrão. E, o URL é substituído por urlGenerator. O código atualizado é: \ Drupal :: urlGenerator () -> generateFromRoute ('<front>', [], ['absolute' => TRUE]);
Jason Yarrington
2
Se você executar isso no Drush (versão 8), isso resultará: Padrão.
Justme 28/05
1
@Justme correto - drush é uma ferramenta de linha de comando, então naturalmente não há host http
Clive
6

Existem alguns avisos sobre como acessar diretamente o objeto de solicitação dessa maneira em \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.

Qualquer controlador de formulário estendendo \Drupal\Core\Form\FormBase automaticamente tem essa dependência injetada e pode ser acessada usando:

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

Eu acho (mas não testei) que um controlador de página comum estendendo \Drupal\Core\Controller\ControllerBasepoderia fornecer o request_stackserviço substituindo a \Drupal\Core\Controller\ControllerBase::createfunção e definindo uma $requestpropriedade no construtor. Isso é muito bem descrito para formulários, e o mesmo processo deve ser aplicado aos controladores de página: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a- formulário .

Shaun Dychko
fonte
4

Levando em conta os " avisos sobre o acesso direto ao objeto request dessa maneira em \ Drupal :: request " que Shaun Dychko mencionou, talvez uma boa opção para obter o nome do host seja obtê-lo da variável global $ base_url , com a ajuda do php função parse_url :

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

Se você quiser fazer isso com injeção de dependência e um serviço, poderá usar o RequestStack :

use Symfony\Component\HttpFoundation\RequestStack;

E defina-o assim:

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 depois declare assim:

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