Cómo obtener la URL base de un sitio

34

Mi sitio está en http: //drupal8.local/ . ¿Cómo obtengo la parte drupal8.local de esa URL?

Url::fromRoute('<'current'>')o base_path()devuelve la ruta parth de la URL; Por ejemplo, para http: //drupal8.local/a/b/c/d/e/f , devuelven ' /a/b/c/d/e/f'cuando solo necesito obtener 'drupal8.local'.

¿Cómo puedo obtener esa parte de la URL?

Jasodeep Chatterjee
fuente
2
¿En realidad te refieres al nombre de host o URL base? La URL base puede incluir porciones de ruta cuando Drupal no se ejecuta en el directorio raíz.
mpdonadio

Respuestas:

66

Puede obtener el nombre de host, "drupal8.local", directamente desde la getHost()solicitud:

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

En algunos casos, es posible que también desee obtener el esquema, fx https://drupal8.local:

$host = \Drupal::request()->getSchemeAndHttpHost();
Clive
fuente
36
Nota: \Drupal::request()->getSchemeAndHttpHost()volveremos http://drupal8.local.
Tim
10
Tenga en cuenta que si su sitio está en una ruta secundaria (por ejemplo, su página de inicio está en drupal8.local / uk ), esto no devolverá la ruta secundaria. Para hacer esto, puede usarUrl::fromRoute('<front>', [], ['absolute' => TRUE]);
leon.nk
1
Comentarios a favor de leon.nk. Url te dará el subdirectorio y cualquier puerto si estás en un puerto no estándar. Y, Url se reemplaza por urlGenerator. El código actualizado es: \ Drupal :: urlGenerator () -> generateFromRoute ('<front>', [], ['absolute' => TRUE]);
Jason Yarrington
2
Ejecutando esto desde Drush (versión 8) esto dará un resultado: Predeterminado.
Justme
1
Correcto @Justme: drush es una herramienta de línea de comandos, por lo que, naturalmente, no hay un host http
Clive
6

Hay algunas advertencias sobre el acceso directo al objeto de solicitud de esta manera en \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.

Cualquier controlador de formulario que se extienda \Drupal\Core\Form\FormBaseautomáticamente tiene esta dependencia inyectada, y se puede acceder usando:

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

Creo (pero no he probado) que una extensión de controlador de página normal \Drupal\Core\Controller\ControllerBasepodría proporcionar el request_stackservicio al anular la \Drupal\Core\Controller\ControllerBase::createfunción y luego establecer una $requestpropiedad en el constructor. Esto se describe muy bien para los formularios, y el mismo proceso debería aplicarse para los controladores de página: https://www.drupal.org/docs/8/api/services-and-dependency-injection/dependency-injection-for-a- formar .

Shaun Dychko
fuente
4

Teniendo en cuenta las " advertencias sobre el acceso directo al objeto de solicitud de esta manera en \ Drupal :: request " que mencionó Shaun Dychko , quizás una buena opción para obtener el nombre de host es obtenerlo de la variable global $ base_url , con la ayuda de php función parse_url :

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

Si desea hacer esto con la inyección de dependencia y un servicio, puede usar RequestStack :

use Symfony\Component\HttpFoundation\RequestStack;

Y definirlo así:

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

Y luego declararlo así:

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