LoginSignup
1

More than 1 year has passed since last update.

posted at

Laravelでhiddenに埋め込んだオブジェクトを復元する

あるアクションメソッドでBladeに使用した値をそのまま次の画面のコントローラに引き継ごうとしたら困ったのでメモ。
String型の場合は問題ないのだが、オブジェクトの場合そのままは引き継げない。

例えば

class名がEloquantObjectで
プロパティとして
id = 3
user_roma = tarou
user_name = 太郎
phone = 99-1234-5678

みたいなインスタンスを受け渡すとして、

PostController
$eloquant_obj = EloquantObject::find(3);
$param = ['eloquant_obj' => $eloquant_obj]
return view('sample.view')->with($param);

みたいな感じでBladeに送り込んで、

sample.view.blade.php
<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に埋める。
これを取り出すには以下のようにする。

RestoreContrloller
 $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(コントローラ内でも)でプロパティが取り出せない。
つまり、

{{ $eloquant_obj->user_roma }}とか書くとproperty of non-object みたいなことを言われてエラーになる。
自分はここでハマりました。

そのため、上記のように一旦配列にデコードしたあと、元のクラスのインスタンスにフィルして復元する必要があります。
またfillではなく、forceFillにしないとオートインクリメントの項目が入ってこなくなります。
(モデル側で$fillableに加えればできそうですが、その場合は他の箇所で危険になりそう。)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1