craftcms について
craftcmsは、プラグイン、モジュール、カスタム要素・フィールドタイプ、バックエンド連携でCraft CMS 5を拡張する開発者向けのリファレンススキルです。タスク別にCraft APIの要点と実装時の注意点をまとめています。
主な機能
- 01プラグインとモジュールの開発ガイド
- 02カスタム要素とフィールドタイプ
- 03コントローラー、マイグレーション、イベント
- 04コントロールパネルとバックエンド連携
- 05タスクに応じたリファレンス選択
- 06Craft実装での横断的な注意点
活用シーン
- 01カスタム要素タイプやフィールドタイプの構築
- 02Webhookエンドポイントやキュージョブの追加
- 03プラグイン設定ページやダッシュボードウィジェットの作成
- 04Craftの設定やマイグレーション動作の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ michtio/ craftcms-claude-skills --skill craftcmsインストール後、Claude Code で/craftcmsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/architecture.mdcaching.mdconditions.mdconfig-app.mdconfig-bootstrap.mdconfig-general-extended.mdconfig-general.mdconsole-commands.mdcontrollers.mdcp-components.mdcp-ui-patterns.mdcp.mddebugging.mddeployment.mddrafts-revisions.mdelement-authorization.mdelement-index.mdelements.mdemail.mdevents.mdfield-types-custom.mdfields.mdgraphql.mdidentity-protocols.mdmigrations.mdpermissions.mdplugin-vite.mdquality.mdqueue-jobs.mdsessions-and-auth.md詳細
Craft CMS 5 — 拡張(プラグインとモジュール)
プラグインとモジュールを通じて Craft CMS 5 を拡張するためのリファレンスです。エレメントやサービスから、コントローラー、マイグレーション、フィールド、イベントまで、幅広く扱います。
このスキルの対象は Craft の拡張です。プラグイン、モジュール、カスタムエレメントタイプ、フィールドタイプ、バックエンド連携を構築します。サイト/プラットフォームの開発(コンテンツモデリング、セクション、エントリータイプ、Twig テンプレート、プラグインの選定)については、craft-site スキルを参照してください。
関連スキル — 必ず一緒に読み込む
このスキルが適用された場合は、次のスキルも読み込んでください。
craft-php-guidelines— PHPDoc の規約、セクションヘッダー、命名規則、クラスの構成、ECS/PHPStan、検証チェックリストを扱います。PHP コードには必須です。ddev— すべてのコマンドは DDEV 経由で実行します。ECS、PHPStan、スキャフォールディング、テストの実行に必須です。craft-garnish— CP JavaScript、アセットバンドル、またはインタラクティブな CP コンポーネントを扱う場合に使用します。Garnish のクラスシステム、UI ウィジェット(Modal、HUD、DisclosureMenu、Select)、ドラッグシステム、Craft.* JS クラスパターンを扱います。craft-pest— テストの作成、実行、修正、レビューを行う場合に使用します。markhuot/craft-pest-coreのハーネス、データベース分離(ロールバックはオプトインで、環境変数のオーバーライドは作業ディレクトリに依存します。どちらも開発データベースへの書き込みを気づかれないまま発生させる原因になります)、ファクトリー、HTTP/キュー/DB のアサーション、CI のテストジョブを扱います。craft-cloud— プロジェクトが Craft Cloud でホストされている場合に使用します(リポジトリのルートにあるcraft-cloud.yaml、またはcomposer.json内のcraftcms/cloudで判定します)。プラグインの Cloud 互換性に関する制約に必須です。App::isEphemeral()ガード、アセットバンドルの CDN 公開、キュージョブの 15 分間の上限、トークンをそのまま出力する代わりのcsrfInput()関数、cloud/upのデプロイライフサイクルイベントを扱います。
ドキュメント
- 拡張ガイド:https://craftcms.com/docs/5.x/extend/
- クラスリファレンス:https://docs.craftcms.com/api/v5/
- ジェネレーター:https://craftcms.com/docs/5.x/extend/generator.html
リファレンスファイルだけでは詳細が足りない場合は、該当するドキュメントページで WebFetch を使用してください。
よくある落とし穴(分野横断)
beforePrepare()では必ずaddSelect()を使用してください。これは Craft の規約であり、複数の拡張がカラムを追加する場合にも安全に追加できます。- キューワーカーはプライマリサイトのコンテキストで実行されます。複数サイトを対象にクエリを実行する場合は
->site('*')を使用してください。 getConfig()にidを含めないでください。プロジェクト設定では UID を使用し、データベース ID は使用しません。- モデルやコントローラーにビジネスロジックを記述しないでください。ロジックはサービスに実装します。
- モジュールでは、テンプレートルート、翻訳、
controllerNamespaceを手動で登録する必要があります。自動では登録されません。 - エレメント/クエリでは
DateTimeHelper、サービスではCarbonを使用してください。同じクラス内で混在させないでください。 - CP URL に
/adminをハードコードしないでください。cpTriggerは設定可能です。PHP ではUrlHelper::cpUrl()、Twig ではcpUrl()を使用してください。 - 分割設定ページで
$request->getBodyParams()をそのままsavePluginSettings()に渡さないでください。送信されたキーのみが保存され、ほかの設定は何も通知されずに失われます。先に設定モデル全体を読み込み、プロパティを更新してから保存してください。 - ルートまたはクエリパラメーターに
tokenという名前を付けないでください。Craft の予約済みtokenParamと衝突し、コントローラーが実行される前にリクエストが 400 エラーで拒否されます。controllers.md(予約済みリクエストパラメーター)を参照してください。 - プラグインの
templates/ディレクトリ内で、アンダースコアで始まらないテンプレートはすべて CP から直接ルーティング可能であり、コントローラーのbeforeAction()によるゲートを迂回します。意図的に直接ルートにするテンプレート以外は、すべて先頭にアンダースコアを付けてください。cp.md(CP テンプレートがコントローラーを迂回するルーティング)を参照してください。
リファレンスファイル
タスクに関連するリファレンスファイルを読んでください。複数のファイルが関連することもよくあります。 タスクの例:
- 「カスタム要素タイプを作成する」→
elements.md(まず Architecture セクション)+element-index.md+fields.md+migrations.md+cp.mdを読む - 「階層型/ツリー型の要素タイプを作成する」→
elements.md(Architecture:One Element Class with Native Structure)を読む - 「Webhook エンドポイントを追加する」→
controllers.md+events.mdを読む - 「要素を同期するキュージョブを作成する」→
queue-jobs.md+elements.md+debugging.mdを読む - 「フォームフィールド付きの設定ページを追加する」→
controllers.md+cp.md+architecture.mdを読む - 「カスタムフィールドタイプを登録する」→
fields.md+events.mdを読む - 「PHPStan のエラーを修正する」→
quality.mdを読む - 「ダッシュボードウィジェットを追加する」→
cp-components.md(Dashboard Widgets)+events.md(Widget Types セクション)を読む - 「プラグインユーザー向けにテンプレート変数を公開する」→
events.md(Twig Extensions セクション)を読む - 「エントリーにカスタムメソッドを追加する」→
events.md(Behaviors セクション)を読む - 「カスタム要素タイプまたはフィールドタイプを登録する」→
events.md(Registration Pattern → Registration scope — never gate by request context)を読む - 「ゴミ箱に入れたカスタム要素が削除されない/gc がパージしない/elements テーブルの行が増え続ける」→
events.md(Registration Pattern → Registration scope)を読む - 「CP ユーティリティページを作成する」→
cp-components.md(Utility Pages)+events.md(Utilities セクション)を読む - 「プラグインの CP アセットに Vite を設定する」→
plugin-vite.mdを読み、craft-garnishスキルを読み込む - 「CP ページにドラッグ並べ替えやインタラクティブな JS を追加する」→
craft-garnishスキルを読み込む - 「カスタムフィールドタイプ向けの CP JavaScript を書く」→
fields.mdを読み、craft-garnishスキルを読み込む - 「ヘッドレス Craft API を構築する」→
graphql.mdを読み、headless.mdのためにcraft-siteスキルを読み込む - 「Next.js フロントエンド向けにプレビューを設定する」→
headless.mdのためにcraft-siteスキルを読み込む - 「プラグイン向けに Pest テストを設定する」→
craft-pestスキルを読み込む →isolation.md - 「コントローラーアクションのテストを書く」→
craft-pestスキルを読み込む →patterns.md - 「テストが開発用データベースに書き込まれる/大量の不要な要素が作成された」→
craft-pestスキルを読み込む →isolation.md - 「コードからサイトを作成または削除する(インポーター、プロビジョニングコマンド、フィクスチャ)」→
architecture.md(Creating or deleting sites at runtime)を読む - 「サイト作成後、要素クエリが siteId でフィルタリングされなくなった」→
architecture.md(Creating or deleting sites at runtime —refreshSites()は variant queries の読み取りを無効化しません)を読む - 「サイトを削除したが、セクション/カテゴリグループがまだ参照している」→
architecture.md(Creating or deleting sites at runtime —deleteSite()によるプルーニングとメモ化されたサービスキャッシュの関係)を読む - 「レコードの dateUpdated を基準日時と比較する/「変更日時」のフィルターが数時間ずれる」→
architecture.md(Those strings are naive UTC)を読む - 「ActiveRecord から datetime カラムを読み取り、モデルに格納する」→
architecture.md(Record-to-Model Hydration Boundary)を読む - 「
['like', ...]を使った要素クエリで何も返ってこない」→architecture.md(Element-query param setters don't take Yii operator tuples)を読む - 「タイトル/スラッグの接頭辞で要素を照合する」→
architecture.md(Element-query param setters don't take Yii operator tuples)を読む - 「キャッシュとセッション用に Redis を設定する」→
config-app.mdを読む - 「PHP セッションをデータベースに保存する(ロードバランサー、Redis なし)」→
config-app.md(Session Component —craft\web\DbSession、setup/php-session-table)を読む - 「本番環境用の環境変数を設定する」→
config-bootstrap.mdを読む - 「GeneralConfig の設定を探す」→
config-general.mdを読む - 「プラグインコードで設定値を読み取る(App::env、parseEnv、GeneralConfig)」→
config-bootstrap.md+config-general.mdを読む - 「プラグインコードで allowAdminChanges が有効か確認する」→
config-general.md+cp.md(Read-Only Mode)を読む - 「プラグイン設定内の環境変数($MY_API_KEY)を解決する」→
config-bootstrap.md(App::parseEnv)を読む - 「CRAFT_* 環境変数の規則を理解する」→
config-bootstrap.mdを読む - 「メールトランスポート/SMTP を設定する」→
config-app.mdを読む - 「カスタム URL ルートを設定する」→
config-bootstrap.mdを読む - 「短い単語を検索できるように検索を設定する」→
config-app.mdを読む - 「GraphQL トークンとスキーマを設定する」→
graphql.md+config-general.mdを読む - 「Craft 5.11 へのアップグレード後に GraphQL の
author/uploaderフィールドが消えた」→graphql.md(Craft 5.11 Additions — "Query for users" scope)を読む - 「アクセスの多いサイト向けにキャッシュを設定する」→
caching.mdを読む - 「プラグイン用のカスタム権限を登録する」→
permissions.mdを読む - 「テンプレートでユーザー権限を確認する」→
permissions.mdを読む - 「プラグインのエディション/機能制限を設定する」→
architecture.md(Plugin Editions セクション)を読む - 「流れるようなレンダービルダー/craft.plugin.widget().render() を構築する」→
architecture.md(Render builders: attribute merging, option allowlists)を読む - 「サイトからプラグインのフロントエンド CSS を上書きできない/プラグインのスタイルが優先される」→
architecture.md(プラグイン登録の CSS はサイトのスタイルシートの後に読み込まれる)を読む - 「プラグインの JS が同梱テンプレートでは動作するが、ユーザー作成のテンプレートでは動作しない」→
architecture.md(JS とマークアップ間の契約は公開 API)を読む - 「レジストリ/ジェネレーター出力からドキュメント/スキーマ/型を生成すると、インストール環境やエディションによって結果が異なる」→
quality.md(Generated Artifacts Must Not Read Runtime Registries)を読む - 「リリースを作成する/バージョンにタグを付ける/Packagist で新しいバージョンが配信されない」→
craft-plugin-releaseスキルを読み込む - 「サイトを削除したが、プラグインのサイトごとの行がまだ残っている」→
architecture.md(サイトの削除はソフト削除)を読む - 「キャッシュした false/キャッシュが false を返すため、キャッシュミスかどうか判断できない」→
caching.md(Data Caching → boolean sentinel idiom)を読む - 「プラグイン/運用設定(しきい値、通知の振り分け、ワークフローのマッピング)は、プロジェクト設定と DB のどちらに置くべきか」→
architecture.md(設定はプロジェクト設定に置く)を読む - 「環境間での変更を避けるため、しきい値は DB のみに置くべきか」→
architecture.md(設定はプロジェクト設定に置く)を読む — これは誤解なので正す必要があります - 「プラグインを Craft 4 から 5 にアップグレードする」→
quality.md(Rector セクション)を読む - 「Craft プラグインの CI を設定する」→
quality.md(CI/CD Integration セクション)を読む - 「マイグレーションでセクションまたはフィールドを作成する」→
migrations.md(Content Migrations セクション)を読む - 「インストールが 'Too many keys specified; max 64 keys allowed' で失敗する/インデックスが重複して増え続ける」→
migrations.md(再実行可能なインデックス作成と MySQL の 64 キー上限)を読む - 「モジュールのマイグレーションを実行する/--track=module が拒否される/ライブラリに同梱されたモジュールのスキーマが適用されない」→
migrations.md(モジュールとライブラリに同梱されたモジュールには CLI トラックがない)を読む - 「プラグインのアップグレードで保存された不正なプロジェクト設定値を修正する」→
migrations.md(マイグレーション内で ProjectConfig::flush() を呼び出さない)を読む - 「プログラムからユーザーの一時停止を解除/復元する/解除後もユーザーがロックアウトされたまま」→
elements.md(getStatus() は併存する状態を隠す)を読む - 「settingsAttributes() をオーバーライドする必要はありますか?」→
field-types-custom.md(settingsAttributes() に実際に含まれるもの)を読む - 「データベースの読み取りレプリカを設定する」→
config-app.md(Database Replicas セクション)を読む - 「app.php にモジュールを登録する」→
config-app.md(Module Registration セクション)を読む - 「カスタムバリデーターを作成する」→
architecture.md(Custom Validators セクション)を読む - 「カスタムファイルシステムタイプを作成する」→
events.md(Filesystem Types セクション)を読む - 「要素インデックス用のカスタム条件ルールを構築する」→
cp-ui-patterns.md(Condition Builders)を読む - 「3 状態(オン/継承/オフ)のコントロールを構築する」→
cp-ui-patterns.md(Tri-State Inheritance Controls)を読む - 「プラグインにタブ付き設定ページを追加する」→
cp.md(Tabbed Settings Pages)を読む - 「プラグインが config/.php によるオーバーライドをサポートする場合、設定画面はどう動作させるべきか?」→
cp.md(Settings Pages → Config-file overrides: フィールドを無効にせず、フィールド上に警告を表示する)を読む - 「設定が保存されても何も変わらない/設定ファイルが暗黙的に優先される」→
cp.md(Settings Pages → Config-file overrides)を読む - 「URL タブで移動できないのはなぜか/別ページにはタブとサイドバーナビゲーションのどちらを使うべきか?」→
cp.md(タブはペインを切り替えるものであり、ページ遷移はしません)を読む - 「CP のインデックス/一覧画面を構築する:カラム、コピーチップ、行アクション」→
cp-ui-patterns.md(Index-screen column scheme)+cp-components.md(VueAdminTable)を読む - 「VueAdminTable で見出しが切れる/紹介文や New ボタンはどこに置くべきか?」→
cp-components.md(VueAdminTable → sole pane content)を読む - 「ユーティリティアイコンが表示されない/icon() のパス」→
cp-components.md(Utility Pages)を読む - 「レイアウト要素の Visibility/Editability 条件ビルダーを非表示にする」→
fields.md(条件ビルダーを抑制する)を読む - 「フィールドに「グローバル設定をオーバーライドします」という警告を表示する」→
cp-ui-patterns.md(Field Warning Parameter)を読む - 「Craft CP で使われている CSS 変数/デザイントークンを知る」→
cp-ui-patterns.md(Craft CSS Custom Properties — color/status/spacing/radius/control/focus/font tokens)を読む - 「ブール値の設定には Lightswitch とチェックボックスのどちらがよいか?」→
cp.md(Form Macros Reference → Lightswitch vs checkbox)を読む - 「コピー用テキスト/API キー/Webhook URL のフィールドを表示する」→
cp.md(Form Macros Reference → copytextField)を読む - 「保存/削除/追加ボタンにはどのボタンクラスを使うべきか?」→
cp.md(Form Macros Reference → Button modifier classes)を読む - 「CP ペインに内側のサイドバーサブナビゲーションを追加する」→
cp.md(Form Macros Reference → Inner sidebar navigation)を読む - 「設定ページにインライン編集可能なテーブルを追加する」→
cp-components.md(Editable Table Field)を読む - 「CP でモーダルまたは確認ダイアログを表示する(Craft.confirm() はありません)」→
cp-components.md(Modals)を読み、動作についてはcraft-garnishスキルを読み込む - 「リレーションフィールドの表示モード/previewMode/maxRelations にはどのようなものがあるか?」→
element-index.md(Relation Field Display/Props)を読む - 「Tip/Heading/組み込み UI 要素をフィールドレイアウトに追加する」→
fields.md(Field-Layout UI Elements Reference)を読む - 「要素編集画面のサイドバーにパネルを追加する」→
cp-ui-patterns.md(Element Edit Screen)+elements.md(EVENT_DEFINE_SIDEBAR_HTML)を読む - 「要素の上部ツールバーに分割ボタンを追加する」→
cp-ui-patterns.md(Element Edit Screen → toolbar split button)+elements.md(EVENT_DEFINE_ADDITIONAL_BUTTONS)を読む - 「サイドバーパネルがスタイルなしで表示される/見た目がおかしいのはなぜか?」→
cp-ui-patterns.md(Element Edit Screen →.metaと.meta read-only)を読む - 「カスタム要素で metaFieldsHtml() をオーバーライドする」→
cp-ui-patterns.md(Element Edit Screen → metaFieldsHtml override)を読む - 「コード品質向上のために pre-commit フックを設定する」→
quality.md(Pre-Commit Hooks セクション)を読む - 「ユーザーグループごとに要素へのアクセスを制限する」→
element-authorization.md+permissions.mdを読む - 「CP の要素インデックスを権限でスコープする」→
element-authorization.md(Layer 3: Query Scoping)を読む - 「カスタム要素に認可イベントを追加する」→
element-authorization.md+elements.mdを読む - 「セキュリティプラグインの多層防御を構築する」→
element-authorization.md(Defense Patterns)を読む - 「ユーザーをすべてのデバイスから強制ログアウトさせる」→
sessions-and-auth.md(Plugin Patterns)を読む - 「Craft のセッションの仕組みを理解する」→
sessions-and-auth.mdを読む - 「パスワードリセットを必須にする」→
sessions-and-auth.md(passwordResetRequired Gap)を読む - 「Users 要素インデックスにカラムを追加する」→
element-index.md(イベントを使った要素インデックスの拡張)を読む - 「要素インデックスに一括アクションを追加する」→
element-index.md(カスタム一括アクションの追加)を読む - 「要素ごとの編集画面メニューにアクションを追加する」→
element-index.md(要素ごとの編集画面アクションメニュー)を読む - 「テーブルカラムにステータスピルを表示する」→
element-index.md(テーブル属性のステータスピル)を読む - 「要素インデックスにカスタムサイドバーソースを追加する」→
element-index.md(サイドバーソースの追加)を読む - 「カスタムフィールドタイプを構築する」→
field-types-custom.md+fields.mdを読む - 「リレーションフィールドタイプを構築する」→
field-types-custom.md(Relation Fields)を読む - 「エントリーインデックスに条件ルールを追加する」→
conditions.md+element-index.mdを読む - 「カスタム条件ルールを構築する」→
conditions.mdを読む - 「プラグインからメールを送信する」→
email.mdを読む - 「カスタムシステムメッセージを登録する」→
email.md(カスタムシステムメッセージの登録)を読む - 「SMTP トランスポートを設定する」→
config-app.md+email.mdを読む - 「Craft CMS を本番環境にデプロイする」→
deployment.mdを読む - 「Craft プロジェクトの CI/CD を設定する」→
deployment.md(CI/CD Patterns)を読む - 「ダウンタイムなしでデプロイする」→
deployment.md(Zero-Downtime)を読む - 「失敗したデプロイをロールバックする」→
deployment.md(Rollback Strategies)を読む - 「ドラフトとリビジョンを扱う」→
drafts-revisions.mdを読む - 「プログラムからドラフトを作成する」→
drafts-revisions.md(ドラフトの作成)を読む - 「afterSave でドラフトに対する副作用をスキップする」→
drafts-revisions.md(Plugin Considerations)を読む - 「カスタム要素に生成フィールドを追加する」→
elements.md(Generated Fields)を読む - 「チップまたはカードとしての要素の表示をカスタマイズする」→
element-index.md(Element Display Modes)を読む - 「ユーザー編集ページに画面を追加する」→
elements.md(Extending User Edit Screens)を読む - 「allowAdminChanges がオフのときにプラグイン設定を読み取り専用にする」→
cp.md(Read-Only Mode)を読む - 「プラグインの設定ページにタブを追加する」→
cp.md(Settings Pages → タブまたはカスタムアクションを使用する)を読む。settingsHtml()は単一ペイン専用です。タブを使うにはカスタムコントローラーを用意し、_layouts/cpを直接拡張するテンプレートが必要です。 - 「プラグイン専用の CP セクション内にプラグイン設定を表示する(グローバル設定/プラグイン画面ではなく)」→
cp.md(Settings Pages → 設定をプラグイン専用の CP セクション内に配置する)を読む - 「プラグインを Cloud 対応にする」→
craft-cloudスキルを読み込む →plugin-development.md(一時ファイルシステム、アセットバンドルの制約、キュー上限、CSRF 関数、Cookie を使用しない設計) - 「Craft プロジェクトを Cloud にデプロイする」→
craft-cloudスキルを読み込む →config-file.md+deploy-pipeline.md+extension.md - 「セルフホストの Craft サイトを Cloud に移行する」→
craft-cloudスキルを読み込む →migration.md - 「プラグインによるファイル書き込みが Cloud で何も通知されずに失敗するのはなぜか?」→
craft-cloudスキルを読み込む →plugin-development.md(一時ファイルシステム)+extension.md(App::isEphemeral) - 「SSO/OIDC ログインまたは SCIM プロビジョニング機能を構築する」→
identity-protocols.md+sessions-and-auth.mdを読む - 「シングルログアウト/logout_token/プロバイダー起点のデプロビジョニングを扱う」→
identity-protocols.mdを読む タスクに必要なリファレンスファイルのみを読み込んでください。ファイルごとに、毎回入力トークンを消費します。 | タスク | 参照先 | 約トークン数 | |------|------|--------:| | エレメントの基礎:ライフサイクル、クエリ、ステータス、認可、下書き、リビジョン、伝播、フィールドレイアウト、ユーザー編集画面、イベント |references/elements.md| 8.4K | | エレメントインデックス:ソース、テーブル/カード属性、ステータスピル、並べ替え、条件、アクション(一括およびエレメントごとのアクションメニュー)、エクスポーター、サイドバー、メタデータ、リレーションフィールドの表示/プロパティ(viewMode、previewMode、maxRelations)、イベントによる拡張 |references/element-index.md| 6.1K | | サービス、モデル、レコード、プロジェクト設定(ランタイムでのサイト作成/削除キャッシュを含む)、MemoizableArray、イベント、API クライアント、カスタムバリデーター |references/architecture.md| 7.4K | | コントローラー:CP の CRUD、Webhook、API エンドポイント、アクションのルーティング、認可 |references/controllers.md| 3.9K | | CP テンプレート、フォームマクロ(lightswitch と checkbox の違い、copytext、money、ボタンのクラスを含む)、設定ページ、ナビゲーション(内側のサイドバーナビゲーションを含む)、権限、読み取り専用モード |references/cp.md| 7.2K | | CP コンポーネント:ダッシュボードウィジェット、ユーティリティページ、スライドアウトエディター、Ajax、編集可能なテーブル、スピナー、モーダル(マークアップとシェード)、アラート |references/cp-components.md| 1.8K | | CP UI パターン:3 状態コントロール、ステータスインジケーター、セマンティック CSS トークン(色/ステータス/間隔/角丸/コントロール/フォーカス/フォント)、条件ビルダー、アセットバンドル、エレメント編集画面のサイドバーパネルとツールバーの分割ボタン |references/cp-ui-patterns.md| 3.4K | | データベースマイグレーション、Install.php、外部キー、インデックス、冪等性、デプロイ |references/migrations.md| 3.9K | | キュージョブ、BaseJob、TTR、再試行、進捗、バッチジョブ、サイトコンテキスト |references/queue-jobs.md| 4.2K | | コンソールコマンド、引数、オプション、プログレスバー、出力ヘルパー、再保存アクション |references/console-commands.md| 6.0K | | デバッグ、パフォーマンス、クエリ戦略、プロファイリング、Xdebug、キャッシュ、ロギング |references/debugging.md| 4.6K | | PHPStan、ECS、コードレビューのチェックリスト |references/quality.md| 3.5K | | テスト:craft-pestスキルへの案内(Pest/craft-pest-core はその中にあります)と Codeception の基本 |references/testing.md| 0.6K | | フィールドタイプ、ネイティブフィールド、BaseNativeField、フィールドレイアウト要素(組み込みの Tip/Heading/LineBreak/HorizontalRule のリファレンス)、FieldLayoutBehavior |references/fields.md| 3.6K | | イベント:登録、ライフサイクル、命名規則、カスタムイベント、ビヘイビア、Twig 拡張機能、ユーティリティ、ウィジェット、ファイルシステム |references/events.md| 4.4K | | GraphQL の型、クエリ、ミューテーション、ディレクティブ、スキーマコンポーネント、リゾルバー |references/graphql.md| 4.6K | | プラグインの Vite:VitePluginService、CP アセットバンドル、HMR、TypeScript、CP での Vue |references/plugin-vite.md| 2.7K | | ヘッドレスとハイブリッド:headlessMode、GraphQL API、CORS、プレビュー用トークン、フロントエンドフレームワーク | craft-site スキルのreferences/headless.md| 3.4K | | GeneralConfig(システム、ルーティング、セキュリティ、ユーザー、セッション、検索、アセット、画像) |references/config-general.md| 8.4K | | GeneralConfig(コンテンツ、テンプレート、パフォーマンス、GC、ローカライズ、ヘッドレス、GraphQL、アクセシビリティ) |references/config-general-extended.md| 7.2K | | アプリ設定:キャッシュ、セッション、キュー、ミューテックス、メーラー/SMTP、検索、ロギング、CORS、DB レプリカ |references/config-app.md| 5.5K | | 設定のブートストラップ:環境変数、エイリアス、優先順位、fluent API、custom.php、db.php、routes.php |references/config-bootstrap.md| 3.6K | | キャッシュ:テンプレートキャッシュタグ、データキャッシュ、静的キャッシュ(Blitz)、CDN、階層化戦略、無効化 |references/caching.md| 5.2K | | 権限:組み込みハンドル、ユーザーグループ、カスタム登録、Twig/PHP でのチェック、認可イベント |references/permissions.md| 4.7K | | エレメントの認可:4 層の防御モデル、認可イベント、can*() メソッド、クエリのスコープ設定 |references/element-authorization.md| 4.6K | | セッションと認証の内部構造:2 層のセッションモデル、認証トークン、セッションの無効化、昇格セッション |references/sessions-and-auth.md| 3.0K | | SSO/プロビジョニングプラグイン向けの ID プロトコル:バックチャネルとフロントチャネルのログアウト、署名アルゴリズムの許可リスト、issuer とテナンシー(hd クレーム)、SCIM の active:false と PATCH の順序、ベンダーによる RFC からの逸脱 |references/identity-protocols.md| 1.3K | | カスタムフィールドタイプ:構築パターン、値のライフサイクル、設定、入力 HTML、バリデーション、検索、GraphQL |references/field-types-custom.md| 3.5K | | 条件フレームワーク:BaseCondition、ElementCondition、カスタム条件ルール、ルールの登録 |references/conditions.md| 2.3K | | メールシステム:システムメッセージ、カスタムメッセージ、プログラムからの送信、テンプレート、イベント、テスト |references/email.md| 2.4K | | デプロイ:標準パイプライン、プロジェクト設定のデプロイ、ゼロダウンタイム、CI/CD、ロールバック |references/deployment.md| 2.5K | | 下書きとリビジョン:下書きの種類、仮下書き、自動保存、適用、マージ、リビジョン |references/drafts-revisions.md| 2.5K |
プラグインとモジュールの違い
プラグインとモジュールは、同じアーキテクチャパターンを共有しています。違いは、ブートストラップと登録方法にあります。
| 機能 | プラグイン | モジュール |
|---|---|---|
| CP テンプレートルート | 自動(ハンドルによる) | EVENT_REGISTER_CP_TEMPLATE_ROOTS を使って手動で登録 |
| サイトテンプレートルート | イベントを使って手動で登録 | 同じ — どちらも手動で登録 |
| 翻訳カテゴリ | 自動(ハンドルによる) | init() で PhpMessageSource を手動で登録 |
| 設定モデル | 組み込みの createSettingsModel() | 環境変数、設定ファイル、またはプライベートプラグイン(_ プレフィックス) |
| インストールマイグレーション | migrations/Install.php | コンテンツマイグレーションのみ |
| コンソールコマンド | controllerNamespace により自動登録 | parent::init() の前に設定し、ブートストラップする必要があります |
| CP ナビゲーションセクション | $hasCpSection = true | EVENT_REGISTER_CP_NAV_ITEMS |
| プロジェクト設定 | 設定は自動的に追跡 | ProjectConfig::set() のみで手動登録 |
| 名前空間エイリアス | Composer により自動登録 | Craft::setAlias() の呼び出しが必要 |
モジュールテンプレートルートの登録
use craft\events\RegisterTemplateRootsEvent;
use craft\web\View;
Event::on(View::class, View::EVENT_REGISTER_CP_TEMPLATE_ROOTS,
function(RegisterTemplateRootsEvent $event) {
$event->roots['my-module'] = __DIR__ . '/templates';
}
);
モジュール翻訳の登録
Craft::$app->i18n->translations['my-module'] = [
'class' => \craft\i18n\PhpMessageSource::class,
'sourceLanguage' => 'en',
'basePath' => __DIR__ . '/translations',
'allowOverrides' => true,
];
モジュールコンソールコマンドの登録
public function init()
{
Craft::setAlias('@mymodule', __DIR__);
if (Craft::$app->getRequest()->getIsConsoleRequest()) {
$this->controllerNamespace = 'modules\\mymodule\\console\\controllers';
} else {
$this->controllerNamespace = 'modules\\mymodule\\controllers';
}
parent::init(); // MUST come after setting controllerNamespace
}
コンソールコマンドを検出できるようにするには、モジュールを config/app.php でブートストラップする必要があります。
コメント
Markdown 対応