Laravel + Livewire Starter Kit を Docker で検証して改良した fork を公開
公式の laravel/livewire-starter-kit(Livewire v4 + Flux + Alpine)を Docker で動かし、本番運用に耐える形に書き直したフォークを公開する。テストは公式版の 33 passed をベースに 37 passed / 92 assertions。本記事は Livewire 固有の論点に絞る — 3 つのスターターキットの中で Livewire は最も backend 以外の差分が大きい。
検証環境
- PHP 8.5.5
- Laravel 13.x
- Composer 2.9.7
- Node 22.22.2
- npm 10.9.7
- Frontend Livewire v4 + Flux + Alpine
- Database SQLite (tests)
- OS Docker Desktop (php:8.5-cli-bookworm)
Laravel + Livewire Starter Kit を Docker で検証して改良した fork を公開
公式の laravel/livewire-starter-kit(Livewire v4 + Flux + Alpine)を Docker で動かし、本番運用に耐える形に書き直したフォークを公開する。テストは公式版の 33 passed をベースに 37 passed / 92 assertions。本記事は Livewire 固有の論点に絞る — 3 つのスターターキットの中で Livewire は最も backend 以外の差分が大きい。
共通 backend 改修(6 件)は pillar に集約:
→ Laravel スターターキット共通 backend を本番化する 6 つの改修
対象の公式サンプル
| 項目 | 値 |
|---|---|
| 名前 | Laravel + Livewire Starter Kit |
| 公式 URL | https://github.com/laravel/livewire-starter-kit |
| 改良版 fork | https://github.com/codelift-dev/livewire-starter-kit/tree/improvements |
| スタック | Laravel 13 + Livewire v4 + Flux UI + Alpine + Fortify |
| 元 / 改良版ライセンス | MIT / MIT |
| 検証日 | 2026-04-19 |
| 上流 commit | laravel/livewire-starter-kit@62c60c8 |
公式版の検証結果
docker compose run --rm app で 33 passed (77 assertions)。React / Vue 版の 40 passed よりテスト数が少ないが、これは Livewire 変種がフォームの挙動を Livewire component テストハーネス経由で検証するためで、Inertia HTTP ハーネスを使う React / Vue 版とアサーションの分布が違うだけ。カバレッジが劣るわけではない。
Livewire が React / Vue と構造的に違う 4 点
Laravel backend は 3 kit で共通だが、Livewire 変種は次の点が違い、それが findings の構成を変える。
| 項目 | React / Vue | Livewire |
|---|---|---|
@laravel/vite-plugin-wayfinder |
あり(ビルド中に artisan を shell out) | なし |
| Inertia | 使用(初期 props を inline 埋込) | 不使用 |
bootstrap/app.php の既定 middleware |
Inertia 系 3 つ append 済み | 空(callback の中身が // だけ) |
| settings ルート | PATCH/DELETE の HTTP verb + Controller | Route::livewire(...) + 内部 AJAX action |
この 4 点が、以下の Livewire 固有の差を生む。
Wayfinder の落とし穴は起きない
React / Vue で問題になる「composer install 前の npm run build が意味不明に失敗する」現象は、Livewire 版では起きない。vite.config.js(React/Vue は .ts)に @laravel/vite-plugin-wayfinder が入っていないため。ビルドが artisan を shell out しないので、vendor/autoload.php への依存がない。
公式 README に Setup セクションがないのは 3 kit 共通の小さな不備なので、改良版では contributor 向けに追加した。ただし「Wayfinder のバグに見える罠」という React/Vue 固有の深刻さはない。
セキュリティヘッダ middleware — 初期状態が React/Vue より悪い
pillar finding D(セキュリティヘッダ)は 3 kit 共通だが、Livewire の初期状態が一番悪い。bootstrap/app.php の withMiddleware() は callback の中身が // コメントだけで、append された web middleware が 1 つもない。React / Vue は少なくとも Inertia 系の 3 つが入っていたが、Livewire はゼロ。
改良版の SetSecurityHeaders middleware は、この fork で 最初に append される web middleware になる。
CSP — Livewire は nonce 化できる
ここが Livewire の最大の固有性。Inertia 版(React/Vue)は初期 state を inline <script> に埋めるため、CSP から 'unsafe-inline' を外すには Inertia の改造が要る。
Livewire は初期 state を inline script に埋めない。 クライアント JS は外部 <script src> で読まれ、コンポーネントの状態は HTML 要素の wire:* 属性で保持される。更新は /livewire/update への fetch。したがって 'unsafe-inline' を外して nonce ベースの厳格な CSP に移行できる。
この hardening 記事では React/Vue と CSP ポリシーを揃える('unsafe-inline' 保守的に残す)が、Livewire なら更に踏み込める。nonce 化の実装は独立した follow-up 記事に分けた:
→ Laravel + Livewire Starter Kit の CSP を nonce 化
J. settings のレート制限 — Livewire では形が違うので保留
React / Vue では routes/settings.php の PATCH/DELETE に throttle ミドルウェアを足すだけで profile 更新・削除を制限できた。
Livewire は違う。routes/settings.php は Route::livewire('settings/profile', ...) でコンポーネントページを描画する形で、プロフィール更新やパスワード変更は Livewire 内部の AJAX エンドポイント(/livewire/update)を経由する。ルートレベルの throttle は初期ページロードにしか効かず、コンポーネントのアクションには効かない。
正しい対策は「コンポーネントクラスのアクションメソッド内で RateLimiter::tooManyAttempts を呼ぶ」方式だが、これは React/Vue とは substantively 違う commit になる。本 pass では保留とし、別の Livewire 固有記事で扱う予定。
改良版の commit 構成 — 7 commits
| commit | finding | 出典 |
|---|---|---|
| README Setup | A(弱体版 — wayfinder なし) | 本記事 |
.env.example コメント |
B | pillar |
| timezone env 化 | C | pillar |
URL::forceScheme |
E | pillar |
SetSecurityHeaders middleware + test |
D | pillar |
| login rate limiter 2 段化 | G | pillar |
auth log channel + subscriber + test |
I | pillar |
React/Vue は 8 commits、Livewire は 7。差は finding J — Livewire では適用形態が違うため保留した。
テストは公式版 33 passed → 改良版 37 passed / 92 assertions。
before / after(Livewire 固有部分)
| 観点 | 公式版 | 改良版 |
|---|---|---|
php artisan test |
33 passed / 77 assertions | 37 passed / 92 assertions |
| README Setup セクション | なし | 追加 |
| 初期 middleware stack | 空 | SetSecurityHeaders を append |
| CSP の到達可能な厳格度 | — | nonce 化まで可能(follow-up 記事参照) |
共通 backend 6 件の before / after は pillar 記事を参照。
どのケースで向くか
laravel/livewire-starter-kitをベースに本番プロダクトを立ち上げる予定- PHP / Blade 中心でフロントを完結させたい
- CSP を厳格に絞りたい — Livewire は nonce 化で
'unsafe-inline'を外せる(Inertia 版より有利)
再現と取り込み
git clone https://github.com/codelift-dev/livewire-starter-kit.git
cd livewire-starter-kit
git checkout improvements
docker compose -f codelift/docker-compose.yml build
docker compose -f codelift/docker-compose.yml run --rm app
本体差分のみ: git diff main improvements -- . ':!codelift'
関連記事
- pillar: Laravel スターターキット共通 backend を本番化する 6 つの改修
- follow-up: Livewire Starter Kit の CSP を nonce 化
- 姉妹 cluster: React 版 / Vue 版
- 比較: React / Vue / Livewire 比較
ライセンス
元サンプル / 改良版とも MIT。検証結果は検証日時点のもの。
この記事を含む比較
関連記事
- Laravel + React Starter Kit を Docker で検証して改良した fork を公開 公式の laravel/react-starter-kit(Inertia + React 19 + shadcn/ui + Fortify)を Docker Desktop で動かし、本番運用に耐える形に書き直したフォークを公開する。テストは公式版の 40 passed をベースに 44 passed / 151 assertions まで増加。本記事は React / Inertia 固有の論点に絞って記録する。
- Laravel + Vue Starter Kit を Docker で検証して改良した fork を公開 公式の laravel/vue-starter-kit(Inertia + Vue 3 + shadcn-vue + Fortify)を Docker で動かし、本番運用に耐える形に書き直したフォークを公開する。テストは 40 passed → 44 passed / 151 assertions。本記事は Vue / Inertia 固有の論点に絞る。
- Laravel スターターキット共通 backend を本番化する 6 つの改修 Laravel 公式のスターターキット(React / Vue / Livewire)は、フロントエンド層こそ違うものの backend は同一の Laravel + Fortify コード を共有している。そのため、本番運用に向けた hardening も 3 つで共通する部分が大半を占める。本記事はその共通部分 — CodeLift が 3 つの fork すべてに適用した backend 改修 — を 1 か所にまとめた pillar(土台)記事である。
- Laravel + Livewire Starter Kit の CSP を nonce 化 Livewire Starter Kit の Docker 検証・改良版フォークで組んだ SetSecurityHeaders middleware は、Content-Security-Policy の script-src / style-src に 'unsafe-inline' を残していた。これは React / Vue 変種と揃えるための暫定措置で、Livewire 変種では 実際には不要 と前回の記事でも予告した通り。本記事ではその予告を回収する作業ログと、最…