Com obtenir un node pel seu NID a Drupal modern

Client
  • Omitsis
Technologies
Date
  • 14/06/2024

Si vens de Drupal 7, recordaràs com de simple era carregar un node:

$nid = 123;
$node = node_load($nid);

A Drupal modern (10, 11 i posteriors) la cosa ha canviat. Tenim diverses formes de fer-ho, cadascuna amb els seus avantatges.

La forma ràpida (similar a Drupal 7)

Si busques alguna cosa semblant al que feies abans:

use Drupal\node\Entity\Node;

$nid = 123;
$node = Node::load($nid);

Aquesta és l’opció més concisa i perfectament vàlida per a scripts, hooks o codi ràpid.

La forma recomanada (injecció de dependències)

En serveis, controladors o plugins, el correcte és injectar l’EntityTypeManager:

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\node\NodeInterface;

class ElMeuServei {

  public function __construct(
    protected EntityTypeManagerInterface $entityTypeManager,
  ) {}

  public function carregarNode(int $nid): ?NodeInterface {
    return $this->entityTypeManager->getStorage('node')->load($nid);
  }

}

Per què? Perquè fa el codi testejable, desacoblat i segueix els estàndards de Drupal.

Carregar múltiples nodes

Per carregar diversos nodes alhora, utilitza loadMultiple():

use Drupal\node\Entity\Node;

$nids = [1, 2, 3, 45, 67];
$nodes = Node::loadMultiple($nids);

foreach ($nodes as $node) {
  // Treballar amb cada node
}

Buscar nodes per camp (EntityQuery)

Si necessites buscar nodes per algun criteri abans de carregar-los:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'article')
  ->condition('status', 1)
  ->condition('field_categoria', 'tecnologia')
  ->accessCheck(TRUE)
  ->execute();

$nodes = Node::loadMultiple($nids);

Important: Des de Drupal 9.2, accessCheck() és obligatori. Si no l’incloues, veuràs un avís de deprecació.

Resum ràpid

SituacióMètode recomanat
Script ràpid o hookNode::load($nid)
Servei o controladorInjectar EntityTypeManager
Carregar diversos nodesNode::loadMultiple($nids)
Buscar per criterisentityQuery() + loadMultiple()

Bonus: accedir a camps del node

Un cop carregat el node:

// Obtenir el títol
$titol = $node->getTitle();

// Obtenir un camp
$valor = $node->get('field_el_meu_camp')->value;

// Obtenir referència a entitat (ex: imatge, terme)
$media = $node->get('field_imatge')->entity;

// Verificar si el camp té valor
if (!$node->get('field_el_meu_camp')->isEmpty()) {
  // ...
}
El codi ha canviat respecte a Drupal 7, però un cop t'hi acostumes, el sistema d'entitats és molt més potent i consistent.

CA

Carlos Rincón

developer

Recent Posts