Como obtenho o alias ou o caminho do caminho atual?

56

Como posso obter o alias e / ou caminho atual no Drupal 8?

No Drupal 7 eu fiz isso com drupal_get_path_alias(). Qual é o código equivalente que devo usar no Drupal 8?

Yusef
fonte

Respostas:

108

Algumas das outras respostas estavam corretas apenas nas versões alfa / beta anteriores do Drupal 8, ou pareciam estar incompletas. A partir do beta7 (e espero que permanentemente), as seguintes regras devem ser aplicadas:

Para o caminho bruto atual (o caminho Drupal sem alias):

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

Para o URI atual , que é praticamente uma representação direta da solicitação (pode até incluir uma string de consulta):

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

Obviamente, não há garantia de que esse $current_urivalor fornecerá um alias, mesmo que um esteja disponível para a solicitação, pois representa apenas o que o usuário solicitou. Então, para fazer estritamente o que você está perguntando (obtenha o alias, se disponível, e o caminho, se não), acho que você poderia fazer:

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

Obviamente, dependendo do tipo de processamento que você está executando, pode ser melhor trabalhar com rotas em vez de caminhos, mas suponho que esse seja um outro tópico.

rjacobs
fonte
por que você menciona que seria melhor usar rotas em vez de caminhos? Você pode fornecer um breve exemplo / razão?
itsdarrylnorris
@ darol100, talvez eu não seja a melhor pessoa para fornecer uma resposta abrangente para isso, mas posso lhe dizer que o uso de caminhos para geração programática de URL é oficialmente depreciado no Drupal 8 - veja: drupal.org/node/2046643 . As rotas do Symfony fornecem uma maneira mais robusta de mapear recursos independentemente das estruturas de caminho (se você criar um link usando rotas, esse link continuará funcionando mesmo se o caminho / padrão da URL mudar).
rjacobs
Apenas uma observação que ::getAliasByPath()não aceitará mais uma string de caminho sem uma barra inicial (desde a versão beta13, eu acredito).
othermachines 15/09/2015
5
getAliasByPathretorna o caminho sem prefixo de idioma. Alguma idéia de como resolver isso?
Philipp Michael
11
o que dizer de dentro de um modelo de galho?
COMA
35

A maneira correta para o URL sem o alias do URL.

$current_path = \Drupal::service('path.current')->getPath()
Daniel Wehner
fonte
O \Drupal::request()->getRequestUri();respeito ao Drupal instala em uma subpasta?
Brian
como eu faria isso por um caminho não atual? existe uma maneira de obtê-lo apenas de uma string?
precisa saber é o seguinte
Como obtenho o caminho absoluto, como este: mydrupalsite.org/node/123 ?
mcaleaa
11
global $ base_root; $ current_uri = \ Drupal :: request () -> getRequestUri (); $ current_path = $ base_root. $ current_uri;
oknate
18

No Drupal 8, você pode fazer isso com o Twig:

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

exemplo:

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

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

Nicola De Lazzari
fonte
11
Great find @ nicola-de-lazzari - Suas respostas também funcionam no Views. Exibir> Campos> Reescrever resultados> O caminho do link aceita {{ url('<current>') }}mesmo que não esteja listado em Padrões de substituição.
Piet
16

Para obter o caminho atual no Drupal 7, você usa current_path(), mas no Drupal 8 você usa $url = Url::fromRoute('<current>');.

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

Nitesh Sethia
fonte
current_path()e drupal_get_path_alias()são funções diferentes.
itsdarrylnorris
Esta deve ser a resposta, pois esta versão fornece o caminho com o prefixo do idioma.
Guillaume Bois
O OP está solicitando o equivalente D8 de drupal_get_path_alias (). Você está retornando o caminho atual e não o caminho alias do D7 'nó /'.$ nid
macjules
9

Para obter o caminho atual (caminho alternativo):

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

Para obter o caminho atual (caminho do sistema):

// Returns node/1
$path = $url->getInternalPath();
Rahul Baisane
fonte
7

Para o Drupal 8, esta é a solução mais limpa que consegui encontrar:

Url::fromRoute('<current>',array(),array('absolute'=>'true'));
crobicha
fonte
5
\Drupal\Core\Url::fromRoute('<current>', [], ['absolute' => 'true'])->toString()
Leymannx
2

Se você deseja o URL absoluto com a string de consulta também:

use Drupal\Core\Url;
// ...
Url::fromRoute('<current>', [], ['query' => \Drupal::request()->query->all(), 'absolute' => 'true'])->toString();
David Thomas
fonte