mcpField
D
drupal-caching

drupal-caching

github.com/edutrulDevelopment7354 installsUpdated 21w ago
Repository

About drupal-caching

A Drupal development skill covering cache metadata, cache tags and contexts, cache backend operations, and service injection. It is for developers implementing caching in Drupal render arrays and services.

Key features

  1. 01Render-array cache metadata
  2. 02Cache tag and context guidance
  3. 03Cache backend read and write
  4. 04Cache service injection

Use cases

  1. 01Adding cache metadata to rendered content
  2. 02Varying output by permissions or URL
  3. 03Reading and invalidating cached data

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/edutrul/drupal-ai --skill drupal-caching

After installing, type/drupal-cachingin Claude Code to confirm it loaded.

Bundled filesREADME.md

Details

From the project README

Drupal Caching

Always add cache metadata. Missing cache metadata causes stale content.

Cache Metadata in Render Arrays

$build['content'] = [
  '#markup' => $output,
  '#cache' => [
    'tags' => ['node:' . $node->id(), 'node_list'],
    'contexts' => ['user.permissions', 'url.query_args'],
    'max-age' => Cache::PERMANENT,
  ],
];

Cache Tags

TagInvalidated when
node:{nid}Node {nid} is saved/deleted
node_listAny node is created or deleted
user:{uid}User {uid} is saved
taxonomy_term:{tid}Term {tid} is saved
config:{name}Config object {name} is saved

Cache Contexts

ContextVaries by
user.permissionsUser's permissions (prefer over user)
user.rolesUser's roles
url.pathURL path
url.query_argsQuery parameters
languagesCurrent language

Reading/Writing Cache

$cached = $this->cacheBackend->get('my_module:my_key');
if ($cached !== FALSE) {
  return $cached->data;
}

$this->cacheBackend->set('my_module:my_key', $data, Cache::PERMANENT, ['node_list']);
$this->cacheBackend->set('my_module:my_key', $data, \Drupal::time()->getRequestTime() + 3600, ['node_list']);
$this->cacheBackend->delete('my_module:my_key');

Cache::invalidateTags(['node:123', 'node_list']);

Inject Cache Service

use Drupal\Core\Cache\CacheBackendInterface;

public function __construct(
  private readonly CacheBackendInterface $cacheBackend,
) {}
# services.yml
my_module.my_service:
  arguments: ['@cache.default']

CacheableDependencyInterface

$build['#cache']['tags'] = Cache::mergeTags(
  $build['#cache']['tags'] ?? [],
  $node->getCacheTags()
);

Comments

Markdown supported