Cómo cargar un nodo por su nid en Drupal moderno

Client
  • Omitsis
Technologies
Services
Date
  • 14/06/2024

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ónMétodo recomendado
Script rápido o hookNode::load($nid)
Servicio o controladorInyectar EntityTypeManager
Cargar varios nodosNode::loadMultiple($nids)
Buscar por criteriosentityQuery() + 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.

CA

Carlos Rincón

developer

Recent Posts