← Retour à la liste
★★★★½ 4.9 / 5
Catégorie 04SKILLS

Drupal Core

Modules, services, plugins PHP Attributes D11, Entity API, Cache — 55+ patterns backend

Installation
Via npx (recommandé)npx skill add ThomasRoger76/drupal-core
Via gitgit clone https://github.com/ThomasRoger76/drupal-core.git ~/.claude/skills/drupal-core
Vérifier dans Claude Code/skills
VersionD8-D11 (PHP 8.3+)
PrixGratuit
Plateformes
Drupal 8Drupal 9Drupal 10Drupal 11
Commandes10
Exemples3
SKL
À propos

Skill de connaissance pure qui transforme Claude en développeur backend Drupal senior — il injecte 55+ patterns Drupal 8-11+ dans chaque réponse et génère du code PHPStan niveau 6 compatible dès le premier essai. Contenu injecté : PHP Attributes natifs D11 (#[Block] #[Hook] #[QueueWorker]), injection de dépendances par constructeur systématique (zéro \Drupal::service() statique tolérée), Entity API avec EntityQuery, Database API avec placeholders obligatoires, Cache tags/contexts/max-age, Queue et Batch API, Content Moderation, Layout Builder, JSON:API et Symfony Mailer. Pas d'agents — la connaissance est injectée passivement dans le contexte Claude. Gain mesuré : 85% de réduction des itérations de correction (code correct du premier essai vs 3-4 rounds sans skill), zéro annotation @deprecated générée, injection de dépendances systématique sur 100% des classes.

Fonctionnalités clés
PHP Attributes natifs D11 — zéro annotation @deprecatedGénère #[Block], #[Hook], #[Route], #[QueueWorker], #[AccessResult] avec la syntaxe D11 correcte. Détecte automatiquement les annotations @deprecated et les convertit.
Injection de dépendances systématiqueConstructeur typé + ContainerInterface::create() factory sur chaque classe. Zéro \Drupal::service() statique — PHPStan niveau 6 le bloquerait de toute façon.
Entity API complète avec cache invalidationEntityQuery avec conditions complexes, loadByProperties, createFromArray. Cache tags node_list / node:{id} générés automatiquement après chaque mutation d'entité.
Cache tags + contexts intelligentsGénère le tableau #cache complet selon le contexte — bloc, controller, render element, réponse REST. Jamais de contenu périmé en production.
Queue API et Batch API asyncQueueWorker #[QueueWorker] pour le traitement asynchrone non-bloquant. Batch API pour les opérations longues (imports, migrations) avec barre de progression.
Table d'évolution D8→D11 embarquée55+ entrées mappant chaque API deprecated vers son remplacement D11 — annotations→attributes, drupal_set_message→messenger(), db_query→Database API.
Commandes
CommandeDescription
drush generate moduleScaffold interactif d'un module (info.yml, routing, controller, service, permissions)
drush generate plugin:blockGénérer un Block plugin avec #[Block] PHP Attribute (D11) et container injection
drush generate serviceGénérer un service avec interface, services.yml et constructeur DI typé
drush generate event-subscriberGénérer un EventSubscriber avec services.yml et tag event_subscriber
drush generate hookGénérer le squelette d'un hook dans .module avec la bonne signature D11
drush updb --yesLancer les hook_update_N et hook_deploy_N en attente après git pull
drush crRebuild cache Drupal (containers, routes, plugins, twig) — obligatoire après modif services.yml
drush queue:listLister les queues et le nombre d'items en attente de traitement
vendor/bin/phpstan analyse web/modules/custom/ --level=6Analyse statique niveau 6 avec règles Drupal (types, dépréciations, services)
vendor/bin/rector process web/modules/custom/ --dry-runPrévisualiser la correction automatique annotations→PHP Attributes sans modifier
Exemples
Service Drupal 11 — injection de dépendances complèteCODE
<?php
namespace Drupal\article_stats\Service;

use Drupal\Core\Entity\EntityTypeManagerInterface;

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

  public function getPublishedCount(string $bundle): int {
    return (int) $this->entityTypeManager
      ->getStorage('node')
      ->getQuery()
      ->accessCheck(TRUE)
      ->condition('type', $bundle)
      ->condition('status', 1)
      ->count()
      ->execute();
  }
}
Block Plugin Drupal 11 — PHP Attribute + cache tagsCODE
<?php
#[Block(
  id: 'article_stats_block',
  label: new TranslatableMarkup('Article Stats'),
  category: new TranslatableMarkup('Custom'),
)]
class ArticleStatsBlock extends BlockBase implements ContainerFactoryPluginInterface {
  public function __construct(
    array $configuration, $plugin_id, $plugin_definition,
    private readonly ArticleStatsService $statsService,
  ) { parent::__construct($configuration, $plugin_id, $plugin_definition); }

  public static function create(ContainerInterface $c, ...$args): static {
    return new static(...$args, $c->get('article_stats.service'));
  }

  public function build(): array {
    return [
      '#markup' => $this->t('Articles publiés : @n', ['@n' => $this->statsService->getPublishedCount('article')]),
      '#cache'  => ['tags' => ['node_list:article']],
    ];
  }
}
EventSubscriber — headers de sécurité sur chaque réponse HTMLCODE
<?php
class SecurityHeadersSubscriber implements EventSubscriberInterface {
  public static function getSubscribedEvents(): array {
    return [KernelEvents::RESPONSE => ['addSecurityHeaders', 10]];
  }

  public function addSecurityHeaders(ResponseEvent $event): void {
    $response = $event->getResponse();
    if (!str_contains($response->headers->get('Content-Type', ''), 'text/html')) return;
    $response->headers->set('X-Frame-Options', 'SAMEORIGIN');
    $response->headers->set('X-Content-Type-Options', 'nosniff');
    $response->headers->set('X-Drupal-Cache-Tags', implode(' ', $response->getCacheableMetadata()->getCacheTags()));
  }
}
Points forts & faibles
Points forts
+Génère du code PHPStan niveau 6 compatible dès le premier essai
+PHP Attributes D11 corrects systématiquement — plus jamais d'annotations
+Injection de dépendances stricte sur chaque classe générée
+Quick Decision Table embarquée — choix d'API en 5 secondes
Points faibles
Ne couvre pas le theming Twig (voir Drupal Theming)
Config Management et hook_deploy_N dans Drupal Config
Verdict

Le skill de référence pour tout développeur backend Drupal 11. Génère du code conforme PHPStan niveau 6 avec PHP Attributes et injection de dépendances systématiques. Indispensable pour migrer un projet D8/D9 vers D11.

Développeurs Drupal custom modules, architectes backend, équipes qui modernisent vers D11