Como trabajar con la Entity API en Drupal 8

Imagen
Herramientas de dibujo en una mesa

Una de las revoluciones de Drupal 8, han sido las entidades, existen de dos tipos, entidades de configuracion y entidades de contenido

Comprobaciones


// Comprobar que el objeto es realmente una entidad.
if ($object instanceof \Drupal\Core\Entity\EntityInterface) {
}

// Asegurarse que es una entidad de contenido.
if ($entity instanceof \Drupal\Core\Entity\ContentEntityInterface) {
}

// Obtener el tipo de entidad.
$entity->getEntityTypeId();

// Asegurarse de que es un nodo.
if ($entity instanceof \Drupal\node\NodeInterface) {
}

// Es mejor usar entityType() por si el tipo de entidad es dinamico.
$needed_type = 'node';
if ($entity->getEntityTypeId() == $needed_type) {
}

Obtener informacion de la entidad

Las entidades tienen ciertos metodos genericos a traves de los cuales podemos obtener informacion, como la id, el bundle, la revision, si es nueva, crear un clon... (documentacion):


// Obtener la ID.
$entity->id();

// Obtener el bundle.
$entity->bundle();

// Comprobar si la entidad es nueva.
$entity->isNew();

// Obtener la etiqueta de la entidad, reemplaza al metodo obsoleto entity_label().
$entity->label().

// Obtener la URI de la entidad.
// @todo: Esto puede cambiar con la nueva API para las URI.
$entity->uri();

// Crear un duplicado que se puede guardar como una nueva entidad.
$duplicate = $entity->createDuplicate();

Crear una entidad


// Crear una entidad de manera dinamica.
$node = entity_create('node', array(
  'title' => 'Mi nodo',
  'body' => 'El contenido para el campo body. Esto funciona como la nueva Api de campos de entidades. 
    Se le asignara el campo el valor al primer valor del campo con el idioma predeterminado.',
));

// Tambien puedes usar el metodo estatico "create()" si conoces la clase de la entidad.
$node = Node::create(array('title' => 'Titulo del nodo'));

// Utilizando el gestor de entidades.
$node = \Drupal::entityTypeManager()->getStorage('node')->create(array('type' => 'article', 'title' => 'Otro nodo'));

Cargar entidades


// Usar el metodo estatico.
$node = Node::load(1);

// Carga una sola entidad dinamica, en Drupal 7 existita la funcion entity_load() que cargaba multiples entidades, 
// ahora se ha renombrado a entity_load_multiple() y entity_load() en Drupal 8 carga una sola entidad.
$entity = entity_load($entity_type, $id);

// Utilizando el gestor de almacenamiento.
$entity = \Drupal::entityTypeManager()->getStorage($entity_type)->load(1);

// Cargar multiples entidades, tambien existe entity_load_multiple() para cargar entidades de manera dinamica.
$entity = \Drupal::entityTypeManager()->getStorage($entity_type)->loadMultiple(array(1, 2, 3));

Guardar una entidad


// Guardar una entidad.
$entity->save();

El metodo save() funciona con entidades nuevas y ya existentes; Las entidades de contenido, de manera predeterminada el como se guarden depende de que previamente tengan una id o no.


// El siguiente codigo almacenara el nodo con la id 5, esto fallara si ya existe un nodo con esa id.
$node->nid->value = 5;
$node->enforceIsNew(TRUE);
$node->save()

Eliminar entidades


// Eliminar una sola entidad.
$entity = \Drupal::entityTypeManager()->getStorage('node')->load(1);
$entity->delete();

// Eliminar multiples entidades a lmismo tiempo.
\Drupal::entityTypeManager()->getStorage($entity_type)->delete(array($id1 => $entity1, $id2 => $entity2));

Control de acceso

El metodo "access()" se puede usar para comprobar quien puede hacer que accion con una entidad. El metodo soporta diferentes operaciones, las estandar son "view", "update", "delete" y "create".


// Comprueba si se tiene acceso para visualizar la entidad.
// De manera predeterminada, se comprueba el usuario actualmente autentificado.
if ($entity->access('view')) {
}

// Comprobar si un usuario en concreto puede eliminar la entidad.
if ($entity->access('delete', $account)) {
}

El permiso para crear entidades, es un poco especial, cuando comprobarmo este permiso, lo normal es que no exista todavia una entidad ya la vamos a crear, para comprobar este permiso hayq ue utilizar el EntityTypeManager:


\Drupal::entityTypeManager()->getAccessController('node')->createAccess('article');

Y con eso comprobamos si el usuario actual puede crear entidades del tipo nodo y del bundle "article".