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?

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.


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

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


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


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

7

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

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

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();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.