{} CodeLift

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 以外の差分が大きい。

公開 2026-04-19 検証 2026-04-19 更新 2026-04-19

検証環境

  • 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 app33 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.phpwithMiddleware() は 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.phpRoute::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'

関連記事

ライセンス

元サンプル / 改良版とも MIT。検証結果は検証日時点のもの。

この記事を含む比較

関連記事