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 hook | Node::load($nid) |
| Servei o controlador | Injectar EntityTypeManager |
| Carregar diversos nodes | Node::loadMultiple($nids) |
| Buscar per criteris | entityQuery() + 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.