2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

あるアクションメソッドで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に加えればできそうですが、その場合は他の箇所で危険になりそう。)

2
1
0

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
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?