Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll
04/05/2025, by Ivan

Menu

9.11.3. Trabajar con Hooks de entidades en Drupal

En artículos anteriores ya nos hemos encontrado con hooks. En este artículo profundizaremos en los hooks que te permiten trabajar con entidades, especialmente para ejecutar código personalizado cuando se crean, actualizan o eliminan entidades.

Para una introducción general sobre qué son los hooks:

http://drupalbook.org/drupal/92-what-hook-drupal-8

Lista completa de hooks en la documentación oficial:

https://api.drupal.org/api/drupal/core!core.api.php/group/hooks/8.2.x

hook_entity_presave()

Se ejecuta justo antes de guardar una entidad.

function drupalbook_examples_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'article') {
    $entity->title->value = $entity->title->value . ' by ' . date('d-m-Y');
  }
}

Este hook modifica directamente la entidad antes de guardarla. No uses $entity->save() dentro del hook.

hook_entity_insert()

Se ejecuta justo después de que una nueva entidad ha sido insertada en la base de datos.

function drupalbook_examples_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'page') {
    $node = Node::create([
      'type' => 'article',
      'title' => 'Nueva página creada: ' . $entity->title->value,
    ]);
    $node->save();
  }
}

Este hook se utiliza normalmente para crear o modificar otras entidades en respuesta a una inserción.

hook_entity_update()

Se ejecuta justo después de que una entidad existente ha sido actualizada.

function drupalbook_examples_entity_update(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'page') {
    \Drupal::messenger()->addMessage('Página actualizada: ' . $entity->title->value);
  }
}

No modifiques la entidad ni la guardes dentro de este hook para evitar bucles infinitos.

hook_entity_delete()

Este hook se ejecuta justo después de que una entidad ha sido eliminada.

function drupalbook_examples_entity_delete(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'article') {
    \Drupal::logger('drupalbook_examples')->notice('Artículo eliminado: @title', ['@title' => $entity->label()]);
  }
}

hook_entity_access()

Este hook se utiliza para controlar el acceso a entidades específicas.

use Drupal\Core\Access\AccessResult;

function drupalbook_examples_entity_access(Drupal\Core\Entity\EntityInterface $entity, $operation, Drupal\Core\Session\AccountInterface $account) {
  if ($entity->getEntityTypeId() == 'node' && $entity->getType() == 'article' && $operation == 'view' && in_array('administrator', $account->getRoles())) {
    return AccessResult::forbidden();
  }
}

Ideal para implementar condiciones personalizadas de acceso según rol, horario o lógica del negocio.

Conclusión

Los hooks ofrecen una forma poderosa de intervenir en los procesos internos de Drupal. Al trabajar con entidades, puedes modificar su contenido, controlar el acceso o iniciar acciones complementarias como envíos de correo o registros de logs. Asegúrate siempre de verificar el tipo de entidad y su bundle antes de actuar, para mantener tu código limpio y eficiente.