Obtener alias de ruta desde NID (u objeto de nodo)

22

Tengo un objeto de nodo y estoy tratando de usarlo para obtener una ruta determinada en Drupal 8.

Había drupal_lookup_path()en Drupal 7 pero no veo ningún equivalente o documentación para Drupal 8.

¿Cuál es la nueva forma "Drupal" de obtener una ruta desde un objeto de nodo?

¿Sería algo tan simple como $node->get('path')?

Parece una pregunta simple, pero no encuentro absolutamente ninguna documentación al respecto.

Tenga en cuenta que no quiero el alias de ruta para la ruta actual; Quiero el alias de ruta para un nodo arbitrario, dado un objeto de nodo o una ID de nodo.

Jack Ryan
fuente
3
Posible duplicado de Obtener el alias o ruta actual?
Kevin
Creo que esto podría ser un duplicado, verifique la pregunta vinculada, hay muchas respuestas.
Kevin
La otra pregunta tiene respuestas que dicen cómo obtener el alias de ruta para la ruta actual, no para un nodo para el cual el OP conoce la ID del nodo.
kiamlaluno
No es un duplicado: no quiero la ruta actual. Quiero que la ruta tenga un objeto de nodo arbitrario o NID.
Jack Ryan
Sí, esto no es un duplicado, mira mi respuesta.
4k4

Respuestas:

43

Para obtener la ruta para una identificación de nodo, use AliasManager :: getAliasByPath :

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
4k4
fuente
3
Sí, esto parece correcto y es más simple que mi solución. ¡Gracias!
Jack Ryan
19

¿Qué pasa con el uso de Url :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();
Kevin
fuente
55
IIRC, la principal diferencia entre esto y el uso del AliasManager, es que esto también garantizará que se ejecuten los procesadores de ruta de salida, mientras que AliasManager solo realiza la búsqueda de alias. También puede obtener el Urlobjeto directamente como $node->toUrl().
mpdonadio
1
Mucho mejor solución.
Patrick
16

Si solo tiene el nid, la solución de 4k4 de

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

Funciona genial. Pero si ya tiene un objeto de nodo, puede omitir uno o dos pasos. Los nodos en realidad han incorporado métodos para obtener URL.

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

Devuelve la URL con alias del nodo.

toUrl () devuelve un objeto url. Ver aquí https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

y toString () es un método del objeto url que devuelve la representación de cadena de la url.

Mate
fuente
99
Tenga en cuenta que $node->toUrl()->setAbsolute()->toString()devolverá la URL absoluta, útil para compartir, etc.
Tim
2

También puede usar el método de carga de path.alias_storagepara devolver una matriz de los detalles de alias o boolean false si no se encontró una ruta para ese nodo.

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

rchaplin
fuente
2

La mejor manera de obtener la URL del nodo del objeto nodo-

  • Ruta absoluta : $ nodo-> toUrl () -> setAbsolute () -> toString ();
  • Ruta relativa : $ nodo-> toUrl () -> toString ();

También manejará el lenguaje de nodo.

Prem Patel
fuente
0

Si desea obtener la URL del alias de nodo por idiomas, no olvide usar el idioma de esta manera.

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

Si lo está utilizando en una clase, no olvide utilizar la inyección de dependencias correctamente.

Diosbel Mezquía
fuente
-5

Esperaba una solución más "drupalesca", pero esto es lo que hice para hacer el trabajo:

  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
fuente