あるアクションメソッドでBladeに使用した値をそのまま次の画面のコントローラに引き継ごうとしたら困ったのでメモ。
String型の場合は問題ないのだが、オブジェクトの場合そのままは引き継げない。
例えば
class名がEloquantObjectで
プロパティとして
id = 3
user_roma = tarou
user_name = 太郎
phone = 99-1234-5678
みたいなインスタンスを受け渡すとして、
$eloquant_obj = EloquantObject::find(3);
$param = ['eloquant_obj' => $eloquant_obj]
return view('sample.view')->with($param);
みたいな感じでBladeに送り込んで、
<ul>
<li>{{ $eloquant_obj->user_roma }}</li>
<li>{{ $eloquant_obj->user_name }}</li>
<li>{{ $eloquant_obj->user_phone }}</li>
</ul>
<input type="hidden" name=eloquant_obj value="{{ $eloquant_obj }}">
という感じで、このページでオブジェクトの中身を表示したあと、また次のコントローラのためにhiddenに埋める。
これを取り出すには以下のようにする。
$eloquant_obj = New EloquantObject();
$eloquant_obj->forceFill(json_decode($request->eloquant_obj,true));
まず、空のインスタンスをNewで用意する。
で、これにhiddenの値を書き込むんだけど、そのままでは入らない。
hiddenにオブジェクトを埋めこんだ時に、自動的にjsonに変換されているので、
json_decodeで復元する。
さらにfillするのに配列にしないといけないので、json_decodeの第二引数をtrueにする。
ここで、falseにするとオブジェクトになるんだけど、なぜかEloquantモデルのオブジェクト出ないとBlade(コントローラ内でも)でプロパティが取り出せない。
つまり、
自分はここでハマりました。
そのため、上記のように一旦配列にデコードしたあと、元のクラスのインスタンスにフィルして復元する必要があります。
またfillではなく、forceFillにしないとオートインクリメントの項目が入ってこなくなります。
(モデル側で$fillableに加えればできそうですが、その場合は他の箇所で危険になりそう。)