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?

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.


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()

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


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


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();

7

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

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

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();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.