Obtenir l'alias de chemin à partir du NID (ou de l'objet nœud)

22

J'ai un objet nœud, et j'essaie de l'utiliser pour obtenir un chemin donné dans Drupal 8.

Il y en avait drupal_lookup_path()dans Drupal 7 mais je ne vois aucun équivalent ou documentation pour Drupal 8.

Quelle est la nouvelle façon "Drupal" d'obtenir un chemin à partir d'un objet nœud?

Serait-ce quelque chose de simple comme $node->get('path')?

Cela semble être une question simple, mais je ne trouve absolument aucune documentation à ce sujet.

Remarquez que je ne veux pas l'alias de chemin pour le chemin actuel; Je veux l'alias de chemin pour un nœud arbitraire, étant donné un objet de nœud ou un ID de nœud.

Jack Ryan
la source
Je pense que cela pourrait être un doublon, vérifiez la question liée, il y a beaucoup de réponses.
Kevin
L'autre question a des réponses disant comment obtenir l'alias de chemin pour le chemin actuel, pas pour un nœud pour lequel l'OP connaît l'ID du nœud.
kiamlaluno
Ce n'est pas un doublon - je ne veux pas le chemin actuel. Je veux le chemin donné un objet de nœud arbitraire ou NID.
Jack Ryan
Oui, ce n'est pas un doublon, voir ma réponse.
4k4

Réponses:

43

Pour obtenir le chemin d'accès d'un identifiant de nœud, utilisez AliasManager :: getAliasByPath :

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
4k4
la source
3
Oui, cela semble correct et est plus simple que ma solution. Merci!
Jack Ryan
19

Qu'en est-il de l'utilisation de l' URL :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();
Kevin
la source
5
IIRC, la principale différence entre cela et l'utilisation d'AliasManager, est que cela garantira également que les processeurs de chemin sortant s'exécutent, tandis qu'AliasManager ne fait que la recherche d'alias. Vous pouvez également obtenir l' Urlobjet directement sous $node->toUrl().
mpdonadio
1
Une bien meilleure solution.
Patrick
16

Si vous n'avez que le nid, la solution de 4k4 de

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);

Fonctionne très bien. Mais si vous avez déjà un objet nœud, vous pouvez ignorer une étape ou deux. Les nœuds ont en fait des méthodes intégrées pour obtenir des URL.

$node->toUrl()->toString();

Renverrait l'URL aliasée du nœud.

toUrl () renvoie un objet url. Voir ici https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

et toString () est une méthode de l'objet url qui renvoie la représentation sous forme de chaîne de l'url.

Mat
la source
9
Notez que $node->toUrl()->setAbsolute()->toString()cela renverra l'URL absolue, utile pour le partage, etc.
Tim
2

Vous pouvez également utiliser la méthode de chargement de path.alias_storagepour renvoyer un tableau des détails d'alias ou booléen false si aucun chemin n'a été trouvé pour ce nœud.

$aliasArray = \Drupal::service('path.alias_storage')->load(['source' => '/node/' . $nid]);

rchaplin
la source
2

Meilleure façon d'obtenir l'URL du nœud à partir de l'objet nœud-

  • Chemin absolu : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Chemin relatif : $ node-> toUrl () -> toString ();

Il gérera également le langage du nœud.

Prem Patel
la source
0

Si vous voulez obtenir l'url d'alias de noeud par langues, n'oubliez pas d'utiliser la langue comme celle-ci.

$alias_url = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'. $nid, $langcode);

Si vous l'utilisez dans une classe n'oubliez pas d'utiliser correctement l'injection de dépendances.

Diosbel Mezquía
la source
-5

J'espérais une solution plus "Drupalesque", mais voici ce que je me suis fait pour faire le boulot:

  function getPathFromNID($nid) {
    $db = \Drupal::database();

    $data = $db
        ->select('url_alias', 'u')
        ->fields('u', ['alias'])
        ->condition('source', '/node/' . $nid)
        ->execute()
        ->fetchField();
    return $data;
  }
Jack Ryan
la source