ANNAIマガジン
Drupalレシピ徹底解剖:レシピ機能で実現する次世代モジュラーサイト構築術
この記事の目次

Drupalレシピは、Drupalサイト構築の方法に大きな変革をもたらす新機能です。従来の複雑なディストリビューションから、モジュラーで組み合わせ可能なシステムへと移行する重要なステップです。レシピを使用することで、事前設定された機能、テーマ、さらにはコンテンツを簡単にDrupalサイトに適用できるようになります。「レシピはDrupal専門家の何時間もの作業をボタン一つのクリックで実現し、すべてがDrupalのベストプラクティスに則っている」と言えるでしょう。

レシピの概念と従来の方法との比較

Drupalの従来のディストリビューション(Opigno LMS、Commerce Kickstartなど)やインストールプロファイル(「Minimal」、「Standard」、「Umami」など)は、特定タイプのウェブサイト向けに事前パッケージ化された機能を提供してきましたが、多くの制限がありました。

ディストリビューションとインストールプロファイルの問題点:

  • 更新が難しい
  • 機能の混合や組み合わせができない
  • プロジェクト開始後に追加できない

レシピの利点:

  • 他のレシピと組み合わせ可能
  • 共有が簡単
  • ウェブサイトに軽量な設定として適用されます(インストールは不要です)
  • 特定のディストリビューションやインストールプロファイルの制限でサイトを縛ることはありません
  • モジュールのインストールは可能ですが、独自のコードは持ちません

Drupalの創始者であるDries Buytaertは、「レシピは長年の専門知識を再利用可能で共有可能なソリューションにパッケージ化します」と説明しています。

レシピの技術詳細

レシピの基本構造

レシピは主に以下のファイルとディレクトリで構成されています:

  1. recipe.yml:レシピの核となるファイル。名前、説明、タイプ、依存関係(他のレシピ、モジュール、テーマ)、設定アクションを定義します。
  2. composer.json:依存関係を管理します。typeはdrupal-recipeでなければなりません。
  3. configディレクトリ(オプション):インポートされる静的YAMLの設定ファイルが含まれています。
  4. contentディレクトリ(オプション):レシピによって作成されるコンテンツエンティティを定義するYAMLファイルを含みます。コンテンツは、エンティティタイプIDによるサブディレクトリに配置する必要があります。

開発者の視点から見ると、recipe.ymlファイルはDrupalモジュールやテーマのinfo.ymlファイルと同様の機能を持ちます。

例として、Drupal CMS Blogレシピのrecipe.ymlファイルの一部を示します:

textname: Blog
type: Drupal CMS
description: Adds a blog post content type and listing page.
recipes:
  - drupal_cms_page
install:
  - add_content_by_bundle
  - menu_link_content
  - selective_better_exposed_filters
config:
  strict: false
  import:
    system:
      - system.menu.main
  actions:
    user.role.content_editor:
      grantPermissions:
        - 'create blog content'
        - 'delete blog revisions'
        - 'delete any blog content'
        - 'edit any blog content'
    workflows.workflow.basic_editorial:
      addNodeTypes: ['blog']

合成可能性と粒度

レシピの重要な特徴は「合成可能」(composable)であることです。あるレシピが他のレシピに依存でき、それらは指定された順序で順番に適用されます。

ベストプラクティスとしては、粒度の細かいレシピを作成し、それらを「食事」(meal)や「サイト」レシピとして組み合わせて、より複雑な機能や完全なサイトを構築することが推奨されています。

レシピはモジュールとしてインストールされるわけではなく、一度実行されるスクリプトのようなものです。「レシピを使用した後、それはサイトの一部ではなくなります。その設定とモジュールが組み込まれていること以外に痕跡はなく、レシピ自体は忘れられます」という特徴があります。

設定(Config)の扱い方

  • レシピは単にモジュールからすべての設定を読み込むのではなく、設定インポートのプロセスを使用します
  • 基本設定ファイルはデフォルトでインストールされていますが、設定はオプションです
  • レシピのYAMLファイルに設定をリストすることで、モジュールから選択的に設定を取り込めます
  • レシピは設定を完全に上書きするか、無視するかを選択できます

設定アクション(Config Actions)

設定アクションは、サイト設定を操作するためのより柔軟な方法を提供する強力な機能です。

  • グローバルに、または特定タイプの設定に適用できます
  • APIを通じて拡張可能であり、モジュールが独自のカスタムアクションを定義できます

一般的な設定アクションには以下が含まれます。

  • simple_config_update:特定の設定を変更します
  • create_if_not_exists:設定エンティティが存在しない場合に作成します。これは冪等性(後述を参照)を保つために重要です
  • set_component:フォームや表示モードなどにフィールドなどの項目を追加します
  • set_third_party_setting:サードパーティの設定値を変更します
  • grant_permissions:ロールに対する権限を設定します
  • add_to_all_bundles:コンテンツタイプなど、すべてのバンドルにフィールドを追加します

レシピの適用方法

レシピは「インストール」ではなく以下のいずれかの方法で「適用」します。

  • Drush(drush recipe)を使用したコマンドラインで実行
  • Drupal UIのProject Browserを通じた適用

変更を有効にするには、適用後にキャッシュクリアが必要です。また、レシピはwebディレクトリの兄弟ディレクトリであるrecipesディレクトリに配置されている必要があります。

冪等性

レシピは冪等であるべきです。つまり、何度適用しても、エラーを引き起こしたり結果を変更したりすることなく適用できるという特性です。これは「create if not exists」のような手順によって実現されます。

これは重要です。なぜなら、レシピは複数のレシピの依存関係として含まれ、さまざまなタイミングで適用される可能性があるからです。

Drupal CMSにおけるレシピの役割

レシピはすべてのDrupalユーザー向けに準備されていますが、特に注目すべき実装はDrupal CMSにおけるものです。

レシピはDrupal CMSの基盤となる要素の一つで、シンプルなワンクリック体験を提供するという理念を共有しています。Drupal CMSのインストール時に、サイトの目標に基づいて特定の機能セットを追加する以下のようなオプションが表示されます。

  • 多言語サポート
  • アクセシビリティツール
  • イベント
  • 高度なSEOツール

Driesのデモによると、2024年11月現在では14のレシピが開発中です。

  • イベント、SEO、ブログ、データプライバシー、基本的な多言語コンテンツ、コンテンツ公開ワークフロー、アクセシビリティツール、メディア、高度な検索、アナリティクス、ダッシュボード、マーケティング、コンタクトフォーム、AIなど

実際のレシピ例

イベントレシピ

イベントレシピを適用すると、ウェブサイトに事前設定された「今後のイベント」セクションが追加されます:

  • 「イベントを追加」ボタンで開くコンテンツ作成フォーム
  • 開始日、終了日、期間を設定するための日付と時間ウィジェット
  • タクソノミーから選択できる「場所」フィールド
  • メディアライブラリとの統合によるマルチメディア追加機能
  • 選択した場所を表示するマップウィジェット
  • イベントをドラッグアンドドロップで時間変更できるカレンダー
  • 使用方法の詳しいドキュメントページ

SEOツールレシピ

SEOツールレシピは、ウェブサイトにDrupal SEO用のモジュールと設定を追加します。

  • SEOダッシュボードから主要機能へのアクセス
  • XMLサイトマップ
  • メタタグとschema.orgのデフォルト設定
  • robots.txt設定
  • URLリダイレクト設定
  • SEOフレンドリーURLの自動生成のためのURLエイリアスパターン
  • コンテンツ作成フォームでのSEO分析と最適化ヒント

レシピ開発者向けのベストプラクティス

  1. 粒度の細かいレシピを作成する:大きな機能を小さな、再利用可能なレシピに分割し、それらを組み合わせましょう。
  2. 冪等性を確保する:レシピが複数回適用されても問題が発生しないよう、「create_if_not_exists」のような手順を使用します。
  3. ローカル開発環境でテスト:実際の本番環境に適用する前に、ローカル開発環境でレシピを徹底的にテストします。設定がすべてエクスポートされてクリーンであることを確認します。レシピを適用して、もし何か問題が発生した場合はgitを使用してすべてをクリアしてリセットできます。
  4. 明確なドキュメントを提供:レシピが提供する機能とその利用方法を説明するドキュメントを含めましょう。

制限事項と今後のロードマップ

現在の制限事項

  • レシピはまだ開発中であり、Drupal 10では実験的APIとみなされています。
  • レシピを「アンインストール」または元に戻す正式な方法はありません。
  • 適用前に設定を検証するメカニズムがありません。
  • エラー発生時にレシピは自己クリーンアップを行わないため、バージョン管理システムでロールバック可能な環境での使用が推奨されます。

今後の開発計画

  • フェーズ1完了:レシピを適用するコア機能と設定アクションAPIの実装
  • 進行中の開発項目
    • レシピの解除:レシピ削除時に依存関係をサイトのcomposer.jsonに移動する機能
    • 設定の検証:より堅牢な事前設定検証メカニズム
    • プレースホルダー:設定アクションでの動的ラベルの使用
    • ユーザー入力:APIキーなどの値をユーザーに入力を求める機能
    • ブロック配置アクション:テーマに依存しない柔軟なブロック配置
    • Project Browserとの統合:UIを使ったレシピの作成・発見機能
    • レシピの元に戻す:レシピを適用解除する機能

まとめ

Drupalレシピは、Drupalサイト構築に革新的な変化をもたらします。非技術者でも簡単にサイトを構築でき、開発者にとっては設定の再利用性と共有を促進します。「従来型」のDrupalは「Drupalコア」として発展を続け、新しいDrupal CMSはその上に構築され、レシピを中心機能として提供します。

参照ページ

本記事は以下のページを参照して作成しました。

Drupal Recipes - Composable Configurations for Drupal Websites | DrupalHelps

Examples of how Drupal Recipes work: latest demos of applying features instantly

amazee.io 
Kuniyoshi Toneの写真

この記事を書いた人: Kuniyoshi Tone

ANNAI株式会社

デジタルマーケティングを担当。金剛山を遠くに眺めて大阪からリモートワークしています。