Laravel12ではBladeを使ってビューまで作成できるが、要求の高いユーザインターフェイスを実現するにはフロントエンド側の開発比率が高くなってくる。特にUI/UXを実現するために要件が複雑になってくると、JavaScript/TypeScriptで実装することもできるが、コンポーネント化や再利用性を考えた場合にはReactを選択したほうがよい。さらには、レンダリングの制御までを含めて考えなければならないときにはNext.jsを選択することになる。
このあたりを含めて、開発まえに、技術的要素の選択には何について考えて決めていかなければいけないかを整理していこう。
目的: 開発環境・依存関係・ツールを最初に固め、後の手戻りを最小化する。
概要: PHP 8.3 / Composer / Node を揃え、Docker で環境を統一。品質系(Pint, Larastan, Pest)や監視・権限管理パッケージを初期導入し、CI/CD をすぐ動かせる状態にする。
ランタイム: PHP 8.3 / Composer 2 / Node 20 / MySQL 8 か PostgreSQL 16(本番は InnoDB 並列DDL or PG のロック戦略を想定)
コンテナ: Laravel Sail or Docker Compose(app/web/queue/schedule/db/cache/search を分離)現在は、Dockerで直接コンテナを構築している。(コンテナ構成については別途参照)
パッケージ標準装備
laravel/pint
, phpstan/phpstan
(+ nunomaduro/larastan
), pestphp/pest
laravel/telescope
(本番は権限/環境で制御)spatie/laravel-permission
spatie/laravel-settings
or Config+DBspatie/laravel-health
darkaonline/l5-swagger
or vyuldashev/laravel-openapi
spatie/laravel-medialibrary
spatie/laravel-data
(DTO)ブランチ運用: trunk-based(main
+ 短命 feature ブランチ)+必ず PR・CI
CI/CD: GitHub Actions(lint→static analysis→unit+pest→build→deploy)。デプロイは Laravel Forge/Envoyer or 自前の rolling/blue-green
Dockerコンテナのおかげで開発生産性は飛躍的にあがった。疑似的な開発環境が引き起こす問題は、開発環境では動いたのに、本番環境やステージング環境では動作が違うとか動かないとかの差異が発生する。本番だけ動くなんてこは少ない。そんな場合でも本番だけで動けばいいやという問題でもない。
Windowsでの場合には、WSL(WSL2)を利用する方法とWSL2上にUbuntu VMを置く方法がある。
項目 | WSL1 | WSL2 | WSL2 + Ubuntu VM |
---|---|---|---|
導入の容易さ | ◎ Windowsに標準機能 | ◎ wsl --install で即利用 | △ VMイメージ作成+ネットワーク設定 |
Linux互換性 | △ カーネル非搭載、制約多い | ◎ カーネル搭載で本物のLinux | ◎ 完全なUbuntu |
Docker対応 | ✕ 非対応 | ◎ ネイティブ利用可 | ◎ 本番同等 |
パフォーマンス | ○ ファイルI/O高速(Windows直結)✕ Linuxネイティブ性能なし | ◎ ネイティブLinuxに近い | ○ VMオーバーヘッドあり |
Windowsとの統合 | ◎ Windows FSに直アクセス | ○ 共有可能だが I/O遅め | △ 共有フォルダ/SSH設定必要 |
ネットワーク再現性 | △ 制約多い | ○ 単一環境なら十分 | ◎ VMごと独立、複数ノード検証可 |
運用負荷 | ◎ 少 | ○ 普通 | △ VM更新・管理が必要 |
WSL1
WSL2
WSL2 + Ubuntu VM
目的: アプリが大規模化しても見通しを保ち、責務を明確にする。
概要: ドメイン/アプリケーション/インフラ層を分ける。ユースケースごとにアクションやサービスを作り、入力(FormRequest+DTO)、出力(Resource/Blade)を明確化。
Domain
(エンティティ/値オブジェクト/ドメインサービス)/ Application
(ユースケース=サービス or アクション)/ Infrastructure
(Eloquent, 外部API)Resource
と Query Builder
で最適化。FormRequest
でバリデーション、DTO(laravel-data)
で型安全にユースケースへ渡す。Http\Resources
(API)/Blade(SSR)/Inertia or Livewire(双方向)目的: データの信頼性を担保し、アプリ側で不具合を防ぐ。
概要: 外部キー・ユニーク制約を徹底、Enum はコードとDBを一致。マイグレーションは段階的。現実的なシーディングやベクトル検索まで意識しておく。
BackedEnum
と DB enum/チェック制約を一致gh-ost
(MySQL)や “オンライン DDL” を意識。Factory
+ State
を活用(現実的なサンプルを常備)pgvector
を分離テーブルで(更新はキューで非同期反映)目的: 利用者や外部サービスに一貫性あるI/Fを提供し、フロント実装をスムーズにする。
概要: RESTful + OpenAPI ドキュメント化。Blade/Alpine・Livewire・Inertia など UI スタイルを案件に応じて統一。認証は Sanctum/Passport。
spatie/laravel-query-builder
で統一。Problem Details
形式のエラー応答。laravel/fortify
+ TOTP。目的: 重い処理や定期処理をアプリ本体から切り離し、スケーラブルに保つ。
概要: Redis+Horizonでジョブ管理。イベント駆動で疎結合化。定期処理は schedule() でIdempotentに。
->onQueue('…')
+ job unique key)とリトライ戦略、失敗時は Slack 通知。app/Console/Kernel.php
で idempotent 実装。ロングタスクは Job へ委譲。OrderPlaced
)→ Listener(メール、インデックス更新、Webhook)で疎結合化。目的: バグを未然に防ぎ、安心して改修できる基盤をつくる。
概要: Pest で読みやすいテスト、Factory で再現性あるデータ。PHPStan/Larastanで静的解析をCI必須化。API契約テストで外部連携も担保。
pint
は pre-commit。目的: 標準機能だけでなく権限・秘密情報管理まで網羅し、安全なサービス運営を実現する。
概要: CSRF/XSS/Rate Limit 基本対策。spatie/permission でロール管理。アクションログや秘密管理(Vault/SSM)を徹底。
Route::middleware('throttle:…')
)spatie/laravel-csp
/ secure-headers
、SameSite
/HttpOnly
/Secure
クッキーspatie/permission
(ロール/権限)を必ずテストspatie/laravel-activitylog
(重要操作の追跡).env
は Vault/Parameter Store。キー回転ポリシーを運用設計に含める。目的: 運用後のスケールやトラブル検知を前提に、速さと見える化を確保。
概要: N+1回避、キャッシュ戦略、Octane導入の検討。ログを構造化し、SentryやAPMで監視。/healthで外部監視連携。
->with()
と ->loadCount()
、集計は DB 側、重い一覧はカーソル or paginate()
Cache::remember()
, ビューはフラグメントキャッシュ。Cache::tags()
(Redis)/health
に DB/Queue/Cache/Storage の状態を露出(spatie/laravel-health
)目的: 安定運用とゼロダウンタイムを確保し、リリースリスクを下げる。
概要: Blue-Green デプロイ、マイグレーションは Expand-Contract。キャッシュ系 Artisan コマンドはCI最後に。Backup と復旧手順をRunbook化。
php artisan down --render
は極力使わず、Envoyer/Forge か Blue-Green。.env.production
はマネージドストアで一元管理。config:cache
, route:cache
, event:cache
, view:cache
を CI/CD の最後に。spatie/laravel-backup
+ 世代管理 + 復旧リハーサル。目的: 技術的負債を減らし、誰でも開発・レビューできる文化を作る。
概要: ADRで決定を記録、PRテンプレやリリースノート自動化。ルールは軽量に、チーム全員が守れることを優先。