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.


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

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

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.


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


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.


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.


-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;
  }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.