Drupal Entity Api: Install, Source and Security | FunnelSlayer

Drupal Entity Api

Published by edutrul in drupal-ai

No known issues49 installs

What this skill does

Drupal Entity API — loading, creating, updating, and deleting entities using entity_type.manager. Node, User, Term, Media patterns.

Add Drupal Entity Api to your agent

Review the source and files first. When you are ready, copy the prompt instruction or use the CLI command supported by your environment.

Install with a prompt

Paste this into a compatible coding agent:

add this skill "drupal-entity-api" from https://github.com/edutrul/drupal-ai

Install with the CLI

Run this command in a controlled environment after reviewing the repository:

npx skills add https://github.com/edutrul/drupal-ai --skill drupal-entity-api

Skill instructions

Drupal Entity API

Loading Entities

// Load a single node
$node = $this->entityTypeManager->getStorage('node')->load($nid);

// Load multiple nodes
$nodes = $this->entityTypeManager->getStorage('node')->loadMultiple([1, 2, 3]);

// Load by properties
$nodes = $this->entityTypeManager->getStorage('node')->loadByProperties([
  'type' => 'article',
  'status' => 1,
  'uid' => $uid,
]);

// Load user
$user = $this->entityTypeManager->getStorage('user')->load($uid);

// Load term
$term = $this->entityTypeManager->getStorage('taxonomy_term')->load($tid);

// Load media
$media = $this->entityTypeManager->getStorage('media')->load($mid);

Entity Query

$query = $this->entityTypeManager->getStorage('node')->getQuery()
  ->accessCheck(TRUE)
  ->condition('type', 'article')
  ->condition('status', 1)
  ->condition('field_tags', $tid)
  ->sort('created', 'DESC')
  ->range(0, 10);

$nids = $query->execute();
$nodes = $this->entityTypeManager->getStorage('node')->loadMultiple($nids);

Creating Entities

// Create a node
$node = $this->entityTypeManager->getStorage('node')->create([
  'type' => 'article',
  'title' => 'My Article',
  'status' => 1,
  'uid' => $this->currentUser->id(),
  'field_body' => [
    'value' => 'Content here',
    'format' => 'basic_html',
  ],
]);
$node->save();

// Create a taxonomy term
$term = $this->entityTypeManager->getStorage('taxonomy_term')->create([
  'vid' => 'tags',
  'name' => 'New Tag',
]);
$term->save();

Updating Entities

$node = $this->entityTypeManager->getStorage('node')->load($nid);
if ($node instanceof NodeInterface) {
  $node->set('title', 'Updated Title');
  $node->set('field_body', ['value' => 'New content', 'format' => 'basic_html']);
  $node->save();
}

Deleting Entities

$node = $this->entityTypeManager->getStorage('node')->load($nid);
if ($node) {
  $node->delete();
}

// Delete multiple
$storage = $this->entityTypeManager->getStorage('node');
$nodes = $storage->loadMultiple($nids);
$storage->delete($nodes);

Accessing Field Values

// Simple field
$title = $node->get('title')->value;
$status = $node->get('status')->value;

// Text with format
$body = $node->get('body')->value;
$format = $node->get('body')->format;

// Reference field
$tid = $node->get('field_tags')->target_id;
$term = $node->get('field_tags')->entity;

// Multi-value field
foreach ($node->get('field_images') as $item) {
  $fid = $item->target_id;
  $file = $item->entity;
}

// Check if field is empty
if (!$node->get('field_image')->isEmpty()) { ... }

Access Checking

// Always add access checks
$query->accessCheck(TRUE);

// Check entity access
if ($node->access('view', $account)) { ... }
if ($node->access('update', $account)) { ... }

Inject EntityTypeManager

public function __construct(
  private readonly EntityTypeManagerInterface $entityTypeManager,
) {}

Files included

  • README.md
  • SKILL.md

More skills