このドキュメントは,Jamstack構成(Laravel + Next.js)で構築された作品ログアプリケーション「Opusrium/cataloger-shelf」の開発手順,設定,アーキテクチャをまとめたものです>
- 目的: あらゆる作品(本,アニメ,映画など)の感想やデータを記録・管理する個人用データベースサイト.
- アーキテクチャ: Jamstack (ヘッドレス)
- バックエンド: Laravel (APIモード)
- フロントエンド: Next.js (Reactフレームワーク)
- データベース: MySQL
このプロジェクトはDockerで環境を構築しています.
ターミナルを2つ開き,それぞれ以下のコマンドを実行します.
-
バックエンド (Laravel API) の起動
# プロジェクトルートで実行 docker compose up -d- APIサーバーは
http://localhost:8080で利用可能になります.
- APIサーバーは
-
フロントエンド (Next.js) の起動
# プロジェクトルートで実行 cd frontend npm run dev
- フロントエンドのWebページは
http://localhost:3000で表示されます.
- フロントエンドのWebページは
- バックエンド:
docker compose down - フロントエンド:
Ctrl + C
├── backend/ # Laravel (バックエンド) の全ファイル ├── docker/ # Dockerの設定ファイル ├── frontend/ # Next.js (フロントエンド) の全ファイル └── docker-compose.yml # Docker全体の設計図
docker-compose.yml:web(Nginx),app(PHP),db(MySQL) の3つのコンテナを定義する設計図です.- ポートフォワーディング:
8080:80(web): PCの8080番ポートをNginxコンテナの80番に接続.33060:3306(db): PCの33060番ポートをMySQLコンテナの3306番に接続.
docker/nginx/default.conf:- Nginxの設定ファイル.リクエストをPHPコンテナ(
app)に渡す役割を担います.
- Nginxの設定ファイル.リクエストをPHPコンテナ(
docker/php/Dockerfile:- PHPコンテナの設計図.PHP本体や必要な拡張機能(
pdo_mysqlなど),Composerをインストールします.
- PHPコンテナの設計図.PHP本体や必要な拡張機能(
- 接続情報 (
backend/.env):- LaravelからMySQLコンテナへの接続情報を定義しています.
DB_HOST=dbとなっているのがポイントで,これはdocker-compose.ymlで定義したサービス名です.
- テーブル設計 (
backend/database/migrations/):opusesテーブルの構造は...create_opuses_table.phpファイルに定義されています.- カラムの追加や変更は,新しいマイグレーションファイルを作成して行います.
- マイグレーションの実行:
- テーブル設計を実際のデータベースに反映させるコマンドです.
docker compose exec app php artisan migrate
-
APIルート定義 (
backend/routes/api.php):Route::apiResource('opuses', OpusController::class);の一行で,作品(Opus)に関する基本的なCRUD(作成・読取・更新・削除)のAPIエンドポイントをまとめて定義しています.- 例:
GET /api/opuses,POST /api/opuses,PUT /api/opuses/{id}など.
-
処理ロジック (
backend/app/Http/Controllers/OpusController.php):- 各APIエンドポイントがリクエストを受け取った際の具体的な処理を記述します.
index()は一覧取得,store()は新規作成,update()は更新,destroy()は削除を担当します.
-
モデル (
backend/app/Models/Opus.php):opusesテーブルと直接やり取りをするクラスです.$fillableプロパティには,プログラムからの書き込みを許可するカラム名を定義します(マスアサインメント対策).
- 一覧ページ (
frontend/app/page.tsx):- ページのメインコンポーネントがサーバーサイドで
fetchを使い,バックエンドAPI (http://localhost:8080/api/opuses) から作品一覧を取得して表示します.
- ページのメインコンポーネントがサーバーサイドで
- 新規作成ページ (
frontend/app/opuses/new/page.tsx):'use client';を先頭に記述し,ブラウザ側で動作するクライアントコンポーネントとして定義されています.useStateフックでフォームの入力状態を管理します.- フォームが送信されると,
fetchを使ってバックエンドのPOST /api/opusesエンドポイントにデータを送信します.
- ユーザーがブラウザで
http://localhost:3000にアクセス. - Next.jsサーバーが
frontend/app/page.tsxを実行. page.tsx内のgetOpuses関数が,バックエンドAPIhttp://localhost:8080/api/opusesにfetchでリクエストを送信.- Laravelの
routes/api.phpがリクエストを受け取り,OpusController@indexメソッドを呼び出す. OpusControllerがOpusモデルを使い,DBから全作品データを取得.- Laravelが取得したデータをJSON形式でNext.jsサーバーに返す.
- Next.jsサーバーが受け取ったJSONデータを元にHTMLを生成し,ユーザーのブラウザに送信・表示する.