最近、Laravel のスターターキットに「Fortify」が使われるようになりました。二段階(二要素)認証が可能になり、セキュリティ的に嬉しい変更です。
ただ、バリデーションエラー時に入力値が消える問題を確認したので、対策を記事にしておきますね。

本記事は2025年11月6日現在に書きました。今後のアップデートによってコードや構成が変更される可能性があります。
Laravel × Livewireスターターキットでユーザー登録時に「入力値が消える」問題
ユーザー登録画面(/register)で、バリデーションエラー時に、値が消えてしまいます。

原因:old() が使われていない
原因としては、バリデーションエラー時にこれまでの値を保持する「old関数」がないためです。
resources/views/livewire/auth/register.blade.phpファイルを見ると、入力欄は Livewire + Flux コンポーネントで次のように定義されています。
【register.blade.php】
<form method="POST" action="{{ route('register.store') }}" class="flex flex-col gap-6">
@csrf
<!-- Name -->
<flux:input
name="name"
:label="__('Name')"
type="text"
required
autofocus
autocomplete="name"
:placeholder="__('Full name')"
/>
以前のバージョンでは、サーバー処理も Livewire コンポーネントとして動いており、フォームの状態が Livewire 側で保持されていたため、old() が不要でした。
ですが変更後は、従来のWebルート(action=”{{ route(‘register.store’) }}”)を使った標準的なPOSTリクエストになりました。
具体的には、ユーザー登録の処理は Fortify によって提供される Action クラス(app/Actions/Fortify/CreateNewUser.php) で行われます。
そのため、old()がないと、値が保持されません。
対策:old() を追加する
解決するには、次のようにコードを追加します。
【register.blade.php】
<!-- Name -->
<flux:input
name="name"
:label="__('Name')"
type="text"
required
autofocus
autocomplete="name"
:placeholder="__('Full name')"
{{-- ここに追加 --}}
:value="old('name')"
/>

emailにも同じように、追加しておくと良いかと思います。
<flux:input>のようなBladeコンポーネントは、通常のHTMLタグのように属性を受け取ることができます 。上記の例では、value 属性に old() を指定することで、セッションから取得した古い入力値をコンポーネントに渡しています。
今後は改善されるかも?
今回の挙動は、Flux や Starter Kit 側で修正される可能性があります。
もし公式のアップデートで old() が自動反映されるようになった場合、この修正は不要になるかもしれません。
ただ、それまで困る人がいるかもしれないので、記事にしました。お役にたてば幸いです♪
★2025/11/22追記
この問題をGitHubで報告したところ、コミュニティが迅速に対応してくれました🎉
新しいバージョンのスターターキットでは、`:value=”old()”` が実装されています。
を読んでみた。2つのご留意点と感想.png)

コメント