背景
趣味で運営しているこのブログ、「記事だけじゃなくて、ちょっとした診断フォームや3Dモデル埋め込み、ミニゲームもまとめて扱えたら楽しそうだな…」という思いつきから始まりました。
でも、自作でバラバラに作ると後でメンテも辛いし、分類したり再利用したりの仕組みもしょっちゅう変わる。そこで考えたのが、「コンテンツ管理をまとめるパッケージ」づくりです。
要件ざっくり
- ■ 1. マルチタイプ対応
記事、診断フォーム、ギャラリー、埋め込みゲーム…どれも同じ感覚で登録・編集したい。
- ■ 2. 分類(タクソノミー)との連携
カテゴリ/シリーズ/タグで分けられると、あとで一覧ページやおすすめ表示が楽。
- ■ 3. パッケージ化&複製
作ったコンテンツを「テンプレート」としてエクスポート/インポートできれば、自分用ストックも増える。
- ■ 4. ドメインルールの切り出し
「シリーズは1つだけ」「必須カテゴリーあり」などの制約は別オブジェクトにまとめて、サービス本体はシンプルに。
- ■ 5. コアはフレームワーク非依存
Laravel特有のコードは最小限に抑えて、将来他のプロジェクトにも持っていきやすく。
アーキテクチャ概要

- ■ ContentService
DTO→Entity化 → ルール実行 → 永続化 → 分類同期
- ■ TaxonomySyncService
分類IDとpivotテーブルの同期だけを担当
- ■ Ruleオブジェクト群
SeriesCardinalityRule
やCategoryRequiredRule
のように「分類の制約」を自分で検証
タクソノミー設計のキモ
- ■ type(分類の役割)
category
(大分類)、series
(連載)、tag
(自由キーワード)など
ルールオブジェクトで「seriesは1つだけ」などを実装
-
■ purpose(どこで使うか)
content
(編集画面で表示)、nav
(ナビメニュー)、filter
(一覧ページの絞り込み)UIやAPI出力で必要な分類軸だけ呼び出せる
→ 分類テーブルに type
と purpose
カラムを持たせるだけで、
ほかのコードは「Interface経由でメタ情報を参照」するだけにできるので、柔軟かつ拡張しやすい構造になります。
モジュール化の楽しさ
- ■ プラグイン感覚
分類を使わないならNullTaxonomySyncService
をバインドするだけでOK。
- ■ 疎結合×再利用性
ビジネスロジックは純PHP、永続化やDIだけLaravel依存にしておけば、別リポジトリ化もラク。
- ■ テンプレ共有
パッケージをZIPにして配布→インポート→IDマッピングする仕組みも組み込めます。
(ゆるめの)まとめ
趣味の個人ブログで始めた小さな実験が、いつの間にか「汎用コンテンツ管理パッケージ」の話になっていました。
でも、要は「いろんなタイプの投稿を同じUIで扱って、分類で絞り込みやナビ、複製もできると楽しいよね」というアプローチ。
もし「こういうのいいな」と思ったら、自分の環境で試してみるだけでもグッと世界が広がります。
のんびり開発しつつ、気が向いたらまた新機能をドーンと追加していきますー。