mcpField
D
drupal-render

drupal-render

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

drupal-render について

Drupal 開発者向けの Render Arrays の資料です。配列の構築、キャッシュメタデータ、マークアップの安全な扱い、レンダー要素、遅延ビルダー、プログラムによるレンダリングを説明します。

主な機能

  1. 01レンダー配列の構築
  2. 02キャッシュタグとコンテキストの設定
  3. 03マークアップの安全な処理
  4. 04レンダー要素と遅延ビルダーの利用
  5. 05レンダラーによる出力生成

活用シーン

  1. 01動的コンテンツのキャッシュ設定
  2. 02ユーザー入力の安全な表示
  3. 03コードによる Drupal ページ内容の構築

インストール

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

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

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

同梱ファイルREADME.md

詳細

Drupal レンダー配列

基本構造

$build = [
  '#type' => 'container',
  '#attributes' => ['class' => ['my-wrapper']],
  'content' => [
    '#markup' => $this->t('Hello world'),
  ],
];

キャッシュメタデータ(常に必須)

$build['content'] = [
  '#markup' => $output,
  '#cache' => [
    'tags' => ['node:' . $node->id(), 'node_list'],
    'contexts' => ['user.permissions', 'url.query_args'],
    'max-age' => 3600,
  ],
];
キャッシュタグの規則
タグ無効になるタイミング
node:123ノード 123 が保存されたとき
node_listいずれかのノードが作成または削除されたとき
user:456ユーザー 456 が保存されたとき
taxonomy_term:789ターム 789 が保存されたとき
config:my_module.settings設定が保存されたとき
block_content:1ブロックコンテンツが保存されたとき
キャッシュコンテキスト
コンテキスト変化する条件
user現在のユーザーの識別情報
user.permissionsユーザーの権限
user.rolesユーザーのロール
url完全な URL
url.pathURL パスのみ
url.query_argsクエリー文字列
languages現在の言語
sessionセッションデータ
themeアクティブなテーマ

マークアップの安全性

// Plain text — always safe
$build['#plain_text'] = $user_input;

// Trusted markup — use Markup class
use Drupal\Core\Render\Markup;
$build['#markup'] = Markup::create('<strong>Safe</strong>');

// User input in markup — filter first
use Drupal\Component\Utility\Xss;
$build['#markup'] = Markup::create(Xss::filter($user_input));

// Admin-level markup — allows more tags
$build['#markup'] = Markup::create(Xss::filterAdmin($html));

レンダー要素

// HTML tag
$build['heading'] = [
  '#type' => 'html_tag',
  '#tag' => 'h2',
  '#value' => $this->t('Title'),
  '#attributes' => ['class' => ['my-heading']],
];

// Link
$build['link'] = [
  '#type' => 'link',
  '#title' => $this->t('Go'),
  '#url' => Url::fromRoute('entity.node.canonical', ['node' => $nid]),
  '#attributes' => ['class' => ['button']],
];

// Entity view
$build['node'] = $this->entityTypeManager
  ->getViewBuilder('node')
  ->view($node, 'teaser');

// Inline template
$build['inline'] = [
  '#type' => 'inline_template',
  '#template' => '<div class="{{ class }}">{{ content }}</div>',
  '#context' => ['class' => 'my-class', 'content' => $content],
];

遅延ビルダー(キャッシュ不可のコンテンツ)

$build['dynamic'] = [
  '#lazy_builder' => [
    'my_module.service:buildDynamicContent',
    [$arg1, $arg2],
  ],
  '#create_placeholder' => TRUE,
];

プログラムによるレンダリング

// Inject renderer service
public function __construct(
  private readonly RendererInterface $renderer,
) {}

// Render to string
$html = $this->renderer->render($build);

// Render in isolated context (doesn't bubble cache)
$html = $this->renderer->renderInIsolation($build);

コメント