bladeでよく使うoldヘルパですが、あまりよく分かっていなかったので
新しく学んだことをメモです。
oldヘルパはどこを見ているか
セッションの中の ‘_old_input’ にあるデータを取得しています。
'_old_input' => [ 'key名'=> 'valueデータ', ],
↑こんな風にセッションデータが入っていると、
old('key名') //'valueデータ
でデータを取り出せます。
_old_inputにデータを保存、取得
oldは’_old_input’ のデータを見ているということが分かりました。
‘_old_input’にデータを保存
もしold()で取得できる値を書き換えたくなった場合、
\Session::flashInput(['key名' => '新しいデータ']);
session()->flash('_old_input', ['key名' => '新しいデータ']);
のいずれかで、’_old_input’ のデータを好きな値に書き換えることができます。
old()で’_old_input’の値を取得できない
session()->all()
これで、sessionの _old_input にデータが保存されているのが確認できます。
ただ、sessionに保存されていてもold()で値が取得できない場合があります。
理由:
Symfony\Component\HttpFoundation\Request 内 public function hasSession(/* bool $skipIfUninitialized = false */) { $skipIfUninitialized = \func_num_args() > 0 ? func_get_arg(0) : false; return null !== $this->session && (!$skipIfUninitialized || $this->session instanceof SessionInterface); }
old() は単純にsessionを取ってくるだけではなく、sessionオブジェクトがあるかどうかの確認も行っているようです。
なので、その条件に合致しない場合はセッションデータに関わらずnullが返ります。
ユニットテストなどでリクエストを投げずにoldだけいじろうとすると上手くいかないのは、
このためのようです。。