¿Cómo obtengo el alias o ruta actual?


56

¿Cómo puedo obtener el alias y / o ruta actual en Drupal 8?

En Drupal 7 hice esto con drupal_get_path_alias(). ¿Cuál es el código equivalente que debo usar en Drupal 8?

Respuestas:


108

Algunas de las otras respuestas solo fueron correctas durante las versiones alfa / beta anteriores de Drupal 8, o parecían estar incompletas. A partir de beta7 (y con suerte permanentemente), deberían aplicarse las siguientes reglas:

Para la ruta sin procesar actual (la ruta de Drupal sin alias):

$current_path = \Drupal::service('path.current')->getPath()

Para el URI actual , que es más o menos una representación directa de la solicitud (incluso puede incluir una cadena de consulta):

$current_uri = \Drupal::request()->getRequestUri();

Por supuesto, no hay garantía de que este $current_urivalor le dé un alias, incluso si hay uno disponible para la solicitud, ya que solo representa lo que el usuario ha solicitado. Entonces, para hacer estrictamente lo que está pidiendo (obtener un alias si está disponible y una ruta si no), creo que podría hacer:

$current_path = \Drupal::service('path.current')->getPath();
$result = \Drupal::service('path.alias_manager')->getAliasByPath($current_path);

Por supuesto, dependiendo del tipo de procesamiento que esté haciendo, puede ser mejor trabajar con rutas en lugar de rutas, pero supongo que ese es un tema completamente diferente.


¿Por qué mencionas que sería mejor usar rutas en lugar de caminos? ¿Puedes dar un breve ejemplo / razón?
itsdarrylnorris

@ darol100, puede que no sea la mejor persona para proporcionar una respuesta integral para eso, pero puedo decirle que el uso de rutas para la generación programática de URL se deprecia oficialmente en Drupal 8; consulte: drupal.org/node/2046643 . Las rutas de Symfony proporcionan una forma más robusta de asignar recursos independientemente de las estructuras de ruta (si crea un enlace usando rutas, ese enlace seguirá funcionando incluso si la ruta / patrón de URL cambia).
rjacobs

Solo una nota que ::getAliasByPath()ya no aceptará una cadena de ruta sin una barra inclinada (desde beta13, creo).
othermachines

55
getAliasByPathdevuelve la ruta sin prefijo de idioma. Alguna idea de como resolver esto?
Philipp Michael

1
¿Qué hay de dentro de una plantilla de ramita?
COME el

35

La forma correcta de la URL sin el alias de URL.

$current_path = \Drupal::service('path.current')->getPath()

¿ \Drupal::request()->getRequestUri();Respeta las instalaciones de Drupal en una subcarpeta?
Brian

¿Cómo haría eso para una ruta no actual? ¿hay alguna manera de obtenerlo solo de una cadena?
BrandenB171

¿Cómo obtengo la ruta absoluta, como esta: mydrupalsite.org/node/123 ?
mcaleaa

1
global $ base_root; $ current_uri = \ Drupal :: request () -> getRequestUri (); $ current_path = $ base_root. $ current_uri;
Oknate


16

Para obtener la ruta actual en Drupal 7, se usa current_path(), pero en Drupal 8 se usa $url = Url::fromRoute('<current>');.

Fuente: https://www.drupal.org/node/2382211


current_path()y drupal_get_path_alias()son funciones diferentes.
itsdarrylnorris

Esta debería ser la respuesta, ya que esta versión proporciona la ruta con el prefijo de idioma.
Guillaume Bois

El OP está pidiendo el equivalente D8 de drupal_get_path_alias (). Está devolviendo la ruta actual y NO la ruta con alias desde el 'nodo /'.$ nid
D7

9

Para obtener la ruta actual (ruta con alias):

// Returns something like /about
$url = \Drupal\Core\Url::fromRoute('<current>');

Para obtener la ruta actual (ruta del sistema):

// Returns node/1
$path = $url->getInternalPath();

7

Para Drupal 8, esta es la solución más limpia que pude encontrar:

Url::fromRoute('<current>',array(),array('absolute'=>'true'));

55
\Drupal\Core\Url::fromRoute('<current>', [], ['absolute' => 'true'])->toString()
leymannx


2

Si desea la URL absoluta con la cadena de consulta también:

use Drupal\Core\Url;
// ...
Url::fromRoute('<current>', [], ['query' => \Drupal::request()->query->all(), 'absolute' => 'true'])->toString();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.