Si vienes de Drupal 7, recordarás lo simple que era cargar un nodo:
$nid = 123;
$node = node_load($nid);
En Drupal moderno (Drupal 8, 9, 10 y 11 y los siguientes que salgan) la cosa ha cambiado. Tenemos varias formas de hacerlo, cada una con sus ventajas.
La forma rápida (similar a Drupal 7)
Si buscas algo parecido a lo que hacías antes:
use Drupal\node\Entity\Node; // Esto va siempre arriba del fichero, después del namespace si hay
$nid = 123;
$node = Node::load($nid);
Esta es la opción más concisa y perfectamente válida para scripts, hooks o código rápido.
La forma recomendada (inyección de dependencias)
En servicios, controladores o plugins, lo correcto es inyectar el EntityTypeManager:
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\node\NodeInterface;
class MiServicio {
public function __construct(
protected EntityTypeManagerInterface $entityTypeManager,
) {}
public function cargarNodo(int $nid): ?NodeInterface {
return $this->entityTypeManager->getStorage('node')->load($nid);
}
}
¿Por qué? Porque hace el código testeable, desacoplado y sigue los estándares de Drupal.
Cargar múltiples nodos
Para cargar varios nodos a la vez, usa loadMultiple():
use Drupal\node\Entity\Node;
$nids = [1, 2, 3, 45, 67];
$nodes = Node::loadMultiple($nids);
foreach ($nodes as $node) {
// Trabajar con cada nodo
}
Buscar nodos por campo (EntityQuery)
Si necesitas buscar nodos por algún criterio antes de cargarlos:
$nids = \Drupal::entityQuery('node')
->condition('type', 'article')
->condition('status', 1)
->condition('field_categoria', 'tecnologia')
->accessCheck(TRUE)
->execute();
$nodes = Node::loadMultiple($nids);
Importante: Desde Drupal 9.2, accessCheck() es obligatorio. Si no lo incluyes, verás un aviso de deprecación.
Resumen rápido
| Situación | Método recomendado |
|---|---|
| Script rápido o hook | Node::load($nid) |
| Servicio o controlador | Inyectar EntityTypeManager |
| Cargar varios nodos | Node::loadMultiple($nids) |
| Buscar por criterios | entityQuery() + loadMultiple() |
Bonus: acceder a campos del nodo
Una vez cargado el nodo:
// Obtener el título
$titulo = $node->getTitle();
// Obtener un campo
$valor = $node->get('field_mi_campo')->value;
// Obtener referencia a entidad (ej: imagen, término)
$media = $node->get('field_imagen')->entity;
// Verificar si el campo tiene valor
if (!$node->get('field_mi_campo')->isEmpty()) {
// ...
}
El código ha cambiado respecto a Drupal 7, pero una vez te acostumbras, el sistema de entidades es mucho más potente y consistente.