現在ブリッジSEのyoshyです。今回は、自身初のオリジナルの記事となります。今回は、Laravelのbladeファイルにてよく使われるinputフォームに対するoldメソッドの役割とインプットデータの保持方法について説明していきたいと思います。
導入
つぶやきサイトや記事投稿サイトなどのWEBアプリケーションでは、自分の登録したい内容や変更したい内容を確定させる前に最終的な確認ページを設けることが多く見かけられます。このワンクッションは、ユーザーに入力ミスや情報の誤りがあるかないかを確認させることでUXを向上させることが一つの目的としてあるかと思います。
ここで、万が一、入力に誤りがあった場合、再度入力を訂正するために入力フォームのページに戻り訂正します。その時、毎回毎回入力した情報がリセットされていて、戻るたびに一から入力をユーザーに求めているようでは利便さに欠けることは一目瞭然です。
では、こういう場面で自分の入力したデータを維持したまま入力フォームのページに戻るにはどうすれば良いのでしょうか。
実現方法
ここで出てくるのがoldメソッドになります。
以下の例はFormファサードを用いたものになりますが、Form::text()の第2引数やForm::select()の第3引数(デフォルトのvalue属性値)をnullに設定しておくと、内部的にoldメソッドが使われます。
<div class="px-3 py-4">
<div class="pb-0">
<p>タイトル</p>
</div>
{{ Form::text('title', null, ['class' => 'form-control border-success', 'id' => 'title']) }}
</div>
<div class="px-3 py-4">
<div class="pb-0">
<p>タグ</p>
</div>
{{ Form::select('tags[]', $tags->pluck('name', 'id'), null, ['class' => 'form-select border-success', 'size' => 5, 'aria-label' => 'タグ選択', 'multiple' => true]) }}
</div>
<div class="px-3 py-4">
<div class="pb-0">
<p>記事内容</p>
</div>
{{ Form::textarea('contents', null, ['class' => 'form-control border-success', 'id' => 'contents']) }}
</div>こうすることで、初めてそのページを訪れた場合は、未入力フォームが表示され、確認ページから戻るボタンで戻ってきた場合には、oldメソッドで値が取得され、入力データがフォームにセットされた状態で戻ってくることが可能になります。

あれ?oldメソッドでvalue値がセットされるはずなのに入力データが維持されていない……。
oldメソッドの正体
url()->previous()で直前のURLに戻ろうとしても、入力フォームページへ戻るルーティングで戻っても入力した値が保持されることはありませんでした。
oldメソッドの正体は、前のリクエストで一時保持した入力を取得することが目的で、バリデーションで引っかかった場合にSessionを利用して値をフォームに維持することに主に用いられます。
仮に、次のリクエストまで値を保持し続けたい場合は、次のリクエストまで入力データをセッションに維持し続けられるように工夫する必要があります。
public function confirm(CreateRequest $request)
{
session()->flashInput($request->all());
return view('articles.confirm', compact('request'));
}こうすることで、先ほどのoldメソッドが正常に機能し、入力フォームページに戻っても値が保持されていることが確認できます。

今回は、Laravelで用いられるoldメソッドの役割とインプットデータの保持方法について説明しました。この記事が皆さんの個人開発やプロジェクト等で少しでもお役に立てたら嬉しいと感じています。



