背景

趣味で運営しているこのブログ、「記事だけじゃなくて、ちょっとした診断フォームや3Dモデル埋め込み、ミニゲームもまとめて扱えたら楽しそうだな…」という思いつきから始まりました。

でも、自作でバラバラに作ると後でメンテも辛いし、分類したり再利用したりの仕組みもしょっちゅう変わる。そこで考えたのが、「コンテンツ管理をまとめるパッケージ」づくりです。


要件ざっくり

  • ■ 1. マルチタイプ対応
    記事、診断フォーム、ギャラリー、埋め込みゲーム…どれも同じ感覚で登録・編集したい。

  • ■ 2. 分類(タクソノミー)との連携
    カテゴリ/シリーズ/タグで分けられると、あとで一覧ページやおすすめ表示が楽。

  • ■ 3. パッケージ化&複製
    作ったコンテンツを「テンプレート」としてエクスポート/インポートできれば、自分用ストックも増える。

  • ■ 4. ドメインルールの切り出し
    「シリーズは1つだけ」「必須カテゴリーあり」などの制約は別オブジェクトにまとめて、サービス本体はシンプルに。

  • ■ 5. コアはフレームワーク非依存
    Laravel特有のコードは最小限に抑えて、将来他のプロジェクトにも持っていきやすく。


アーキテクチャ概要

アーキテクチャ概要
  • ContentService
    DTO→Entity化 → ルール実行 → 永続化 → 分類同期

  • TaxonomySyncService
    分類IDとpivotテーブルの同期だけを担当

  • Ruleオブジェクト群
    SeriesCardinalityRuleCategoryRequiredRule のように「分類の制約」を自分で検証


タクソノミー設計のキモ

  • type(分類の役割)
    category(大分類)、series(連載)、tag(自由キーワード)など
    ルールオブジェクトで「seriesは1つだけ」などを実装

  • purpose(どこで使うか)
    content(編集画面で表示)、nav(ナビメニュー)、filter(一覧ページの絞り込み)

    UIやAPI出力で必要な分類軸だけ呼び出せる

→ 分類テーブルに typepurpose カラムを持たせるだけで、
ほかのコードは「Interface経由でメタ情報を参照」するだけにできるので、柔軟かつ拡張しやすい構造になります。


モジュール化の楽しさ

  • プラグイン感覚
    分類を使わないなら NullTaxonomySyncService をバインドするだけでOK。

  • 疎結合×再利用性
    ビジネスロジックは純PHP、永続化やDIだけLaravel依存にしておけば、別リポジトリ化もラク。

  • テンプレ共有
    パッケージをZIPにして配布→インポート→IDマッピングする仕組みも組み込めます。


(ゆるめの)まとめ

趣味の個人ブログで始めた小さな実験が、いつの間にか「汎用コンテンツ管理パッケージ」の話になっていました。
でも、要は「いろんなタイプの投稿を同じUIで扱って、分類で絞り込みやナビ、複製もできると楽しいよね」というアプローチ。


もし「こういうのいいな」と思ったら、自分の環境で試してみるだけでもグッと世界が広がります。
のんびり開発しつつ、気が向いたらまた新機能をドーンと追加していきますー。