drupal-plugins について
Drupal 11 のプラグイン実装を支援する開発スキルです。属性による検出、プラグインマネージャー、依存性注入、設定可能なブロック、Drush ジェネレーターを扱います。
主な機能
- 01PHP属性によるプラグイン検出
- 02マネージャーとIDの指針
- 03依存性注入のパターン
- 04設定可能なブロックの例
- 05Drushプラグインジェネレーター
活用シーン
- 01Drupal 11のブロックプラグイン作成
- 02フィールドウィジェットやフォーマッターの実装
- 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 ではありません |
| インスタンス化 | サービスコンテナではなく、プラグインマネージャーが行います |
| DI | ContainerFactoryPluginInterface が必要です |
| マネージャー | プラグインの種類ごとに専用のマネージャーがあります(例:BlockManager) |
| プラグイン ID | 一意である必要があります。Drupal がプラグインを内部的に識別するために使用されます |
コメント
Markdown 対応