Obter alias de caminho do NID (ou objeto do nó)

22

Eu tenho um objeto de nó e estou tentando usá-lo para obter um determinado caminho no Drupal 8.

Havia drupal_lookup_path()no Drupal 7, mas não estou vendo nenhum equivalente ou documentação para o Drupal 8.

Qual é a nova maneira "Drupal" de obter um caminho de um objeto de nó?

Seria algo simples como $node->get('path')?

Parece uma pergunta simples, mas simplesmente não estou encontrando nenhuma documentação.

Observe que não quero o alias do caminho para o caminho atual; Eu quero o alias do caminho para um nó arbitrário, dado um objeto ou um ID do nó.

Jack Ryan
fonte
3
Possível duplicata de Obter o alias ou caminho do caminho atual?
Kevin
Eu acho que isso pode ser uma duplicata, verifique a pergunta vinculada, há muitas respostas.
Kevin
A outra pergunta tem respostas dizendo como obter o alias do caminho para o caminho atual, não para um nó para o qual o OP conhece o ID do nó.
Kiamlaluno
Não é uma duplicata - não quero o caminho atual. Eu quero o caminho dado um objeto de nó arbitrário ou NID.
Jack Ryan
Sim, isso não é uma cópia, veja minha resposta.
4k4

Respostas:

43

Para obter o caminho para uma identificação de nó, use AliasManager :: getAliasByPath :

$alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$nid);
4k4
fonte
3
Sim, isso parece correto e é mais simples que a minha solução. Obrigado!
Jack Ryan
19

Que tal usar o URL :

use Drupal\Core\Url;    

...

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid])->toString();
Kevin
fonte
5
O IIRC, a principal diferença entre isso e o uso do AliasManager, é que isso também garantirá que os processadores de caminho de saída sejam executados, enquanto o AliasManager apenas faz a pesquisa de alias. Você também pode obter o Urlobjeto diretamente como $node->toUrl().
mpdonadio
1
Solução muito melhor.
21417 Patrick
16

Se você tiver apenas o nid, a solução de 4k4 de

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

Funciona bem. Mas se você já possui um objeto de nó, pode pular uma etapa ou duas. Nós realmente criamos métodos para obter URLs.

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

Retornaria o URL com alias do nó.

toUrl () retorna um objeto de URL. Veja aqui https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.2.x

e toString () é um método do objeto url que retorna a representação de string do URL.

Matt
fonte
9
Observe que $node->toUrl()->setAbsolute()->toString()retornará a URL absoluta, útil para compartilhar etc.
Tim
2

Você também pode usar o método load de path.alias_storagepara retornar uma matriz dos detalhes do alias ou boolean false se não houver um caminho encontrado para esse nó.

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

rchaplin
fonte
2

A melhor maneira de obter o URL do nó a partir do objeto

  • Caminho absoluto : $ node-> toUrl () -> setAbsolute () -> toString ();
  • Caminho relativo : $ node-> toUrl () -> toString ();

Ele também manipulará a linguagem do nó.

Prem Patel
fonte
0

Se você deseja obter o URL de alias do nó por idiomas, não se esqueça de usar o idioma como este.

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

Se você o estiver usando em uma classe, não se esqueça de usar a injeção de dependências corretamente.

Diosbel Mezquía
fonte
-5

Eu esperava uma solução mais "drupalesca", mas eis o que eu me obriguei a fazer o trabalho:

  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
fonte