¿Cómo obtengo el alias o ruta actual?

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.

rjacobs
fuente
¿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()
Daniel Wehner
fuente
¿ \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
18

En Drupal 8 puedes hacer esto con Twig:

{{ url('<current>') }}

ejemplo:

<a href="{{ url('<current>') }}">{{ 'Reload'|t }}</a>

de: https://www.drupal.org/docs/8/theming/twig/functions-in-twig-templates

Nicola De Lazzari
fuente
1
Great find @ nicola-de-lazzari - También tus respuestas también funcionan en Views. Ver> Campos> Reescribir resultados> La ruta de enlace acepta {{ url('<current>') }}aunque no se encuentre en la lista de Patrones de reemplazo.
Piet
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

Nitesh Sethia
fuente
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();
Rahul Baisane
fuente
7

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

Url::fromRoute('<current>',array(),array('absolute'=>'true'));
crobicha
fuente
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();
David Thomas
fuente