Comment puis-je obtenir le pseudonyme ou le chemin actuel?

56

Comment puis-je obtenir le pseudonyme et / ou le chemin actuel dans Drupal 8?

Dans Drupal 7, je l'ai fait avec drupal_get_path_alias(). Quel est le code équivalent que je devrais utiliser dans Drupal 8?

Yusef
la source

Réponses:

108

Certaines des autres réponses n'étaient correctes que lors des précédentes versions alpha / bêta de Drupal 8, ou semblaient être incomplètes. À partir de la version 7 (et, espérons-le, de façon permanente), les règles suivantes devraient s'appliquer:

Pour le chemin brut actuel (le chemin Drupal sans aliasing):

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

Pour l' URI actuel , qui est à peu près une représentation directe de la demande (il peut même inclure une chaîne de requête):

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

Bien entendu, rien ne garantit que cette $current_urivaleur vous donnera un alias, même s'il en existe un pour la requête, car il ne représente que ce que l'utilisateur a demandé. Donc, pour faire strictement ce que vous demandez (obtenir un alias si disponible, et un chemin sinon), je pense que vous pourriez faire:

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

Bien sûr, selon le type de traitement que vous effectuez, il peut être préférable de travailler avec des itinéraires plutôt que des chemins, mais je suppose que c'est un tout autre sujet.

rjacobs
la source
pourquoi dites-vous qu'il serait préférable d'utiliser des itinéraires plutôt que des chemins? Pouvez-vous donner un bref exemple / raison?
Itsdarrylnorris
@ darol100, je ne suis peut-être pas la meilleure personne pour fournir une réponse complète à cela, mais je peux vous dire que l'utilisation de chemins pour la génération d'URL programmatiques est officiellement dépréciée dans Drupal 8 - voir: drupal.org/node/2046643 . Les itinéraires Symfony offrent un moyen plus robuste de mapper des ressources indépendamment des structures de chemins (si vous créez un lien à l'aide d'itinéraires, ce lien continuera à fonctionner même si le chemin / le modèle d'URL change).
rjacobs
Juste une note qui ::getAliasByPath()n'acceptera plus une chaîne de chemin sans slash (depuis beta13 je crois).
Autres machines
5
getAliasByPathrenvoie le chemin sans préfixe de langue. Aucune idée sur la façon de résoudre ça?
Philipp Michael
1
Qu'en est-il de l'intérieur d'un modèle de brindille?
EAT
35

La manière appropriée pour l'URL sans l'alias d'URL.

$current_path = \Drupal::service('path.current')->getPath()
Daniel Wehner
la source
Est- \Drupal::request()->getRequestUri();ce que respect Drupal installe dans un sous-dossier?
Brian
Comment ferais-je cela pour un chemin non courant? y a-t-il un moyen de l'obtenir à partir d'une simple chaîne?
BrandenB171
Comment puis-je obtenir le chemin absolu, tel que celui-ci: mydrupalsite.org/node/123 ?
mcaleaa
1
global $ base_root; $ current_uri = \ Drupal :: request () -> getRequestUri (); $ current_path = $ base_root. $ current_uri;
OK
18

Dans Drupal 8, vous pouvez le faire avec Twig:

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

exemple:

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

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

Nicola De Lazzari
la source
1
Great find @ nicola-de-lazzari - Vos réponses fonctionnent également dans Vues. Affichage> Champs> Résultats de la réécriture> Le chemin de lien est accepté {{ url('<current>') }}même s'il n'est pas répertorié sous Modèles de remplacement.
piet
16

Pour obtenir le chemin actuel dans Drupal 7, vous utilisez current_path(), mais dans Drupal 8, vous utilisez $url = Url::fromRoute('<current>');.

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

Nitesh Sethia
la source
current_path()et drupal_get_path_alias()ce sont des fonctions différentes.
itsdarrylnorris
Cela devrait être la réponse car cette version donne le chemin avec le préfixe de la langue.
Guillaume Bois
L'OP demande l'équivalent D8 de drupal_get_path_alias (). Vous renvoyez le chemin actuel et PAS le chemin avec alias du noeud D7 '/'.$ nid
macjules
9

Pour obtenir le chemin actuel (chemin aliasé):

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

Pour obtenir le chemin actuel (chemin système):

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

Pour Drupal 8, c’est la solution la plus propre que j’ai pu trouver:

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

Si vous voulez aussi l'URL absolue avec la chaîne de requête:

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