mcpField
D
drupal-plugins

drupal-plugins

github.com/edutrul開発7351 回インストール21 週間前に更新
リポジトリ

drupal-plugins について

Drupal 11 のプラグイン実装を支援する開発スキルです。属性による検出、プラグインマネージャー、依存性注入、設定可能なブロック、Drush ジェネレーターを扱います。

主な機能

  1. 01PHP属性によるプラグイン検出
  2. 02マネージャーとIDの指針
  3. 03依存性注入のパターン
  4. 04設定可能なブロックの例
  5. 05Drushプラグインジェネレーター

活用シーン

  1. 01Drupal 11のブロックプラグイン作成
  2. 02フィールドウィジェットやフォーマッターの実装
  3. 03条件またはフィルタープラグインの追加

インストール

コマンドをコピーしてターミナルで実行します。

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

インストール後、Claude Code で/drupal-pluginsを入力して読み込まれたか確認します。

同梱ファイルREADME.md

詳細

Drupal プラグイン(Drupal 11)

例(ベストプラクティス)

// src/Plugin/Block/MyBlock.php
namespace Drupal\my_module\Plugin\Block;

use Drupal\Core\Block\Attribute\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

#[Block(
  id: 'my_block',
  admin_label: new TranslatableMarkup('My Block'),
  category: new TranslatableMarkup('Custom'),
)]
final class MyBlock extends BlockBase implements ContainerFactoryPluginInterface {

  use StringTranslationTrait;

  public function __construct(
    array $configuration,
    string $plugin_id,
    mixed $plugin_definition,
    private readonly EntityTypeManagerInterface $entityTypeManager,
  ) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
  }

  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('entity_type.manager'),
    );
  }

  public function build(): array {
    return [
      '#markup' => $this->t('Hello from my block.'),
      '#cache' => [
        'tags' => ['node_list'],
        'contexts' => ['user.permissions'],
      ],
    ];
  }

}

注:プラグインは属性(レガシーコードではアノテーション)を介して検出され、services.yml では検出されません。

PHP 属性とアノテーションの比較

PHP 属性を使用してください(Drupal 10.2 以降で利用可能。Drupal 11 では必須のスタイルです)。

#[Block(id: 'my_block', admin_label: new TranslatableMarkup('My Block'))]

レガシー(非推奨):

// @Block(id = "my_block", admin_label = @Translation("My Block"))

設定可能なブロック(blockForm / blockSubmit)

public function defaultConfiguration(): array {
  return ['limit' => 5];
}

public function blockForm(array $form, FormStateInterface $form_state): array {
  $form['limit'] = [
    '#type' => 'number',
    '#title' => $this->t('Limit'),
    '#default_value' => $this->configuration['limit'],
  ];
  return $form;
}

public function blockSubmit(array $form, FormStateInterface $form_state): void {
  $this->configuration['limit'] = $form_state->getValue('limit');
}

プラグインジェネレーター

drush generate plugin:block
drush generate plugin:field:formatter
drush generate plugin:field:widget
drush generate plugin:field:type
drush generate plugin:condition
drush generate plugin:filter

基本的な考え方

検出PHP 属性(またはレガシーアノテーション)を介して行います。services.yml ではありません
インスタンス化サービスコンテナではなく、プラグインマネージャーが行います
DIContainerFactoryPluginInterface が必要です
マネージャープラグインの種類ごとに専用のマネージャーがあります(例:BlockManager)
プラグイン ID一意である必要があります。Drupal がプラグインを内部的に識別するために使用されます

コメント