2016-06-17 5 views
0

私は、ブレードテンプレートのシリアル化された配列からプロパティを取得する最適な方法を理解しようとしています。Laravel:私のビューにjson_decodeを使用するにはどうすればいいですか?

MyController.php

$cart = Cart::findOrFail($id); 
... 
return view('view', ['cart' => $cart]); 

したがって、この場合には$cartは、ビューに渡さなっているその中の多くの項目(オブジェクト)を持っています。

私はこの方法で物事にアクセスすることができます。このビューでcart.blade.php

... 

@each('show', $cart->items()->get(), 'item') 

... 

show.blade.php

<p>$item->name</p> 
<p>$item->color</p> 
... 

しかし、また$itemスキュー、ウェイト、数量などを含むシリアル化された属性を持っています。

// $item->serialized_item = {"id":123,"quantity":5,"...} (string) 

だから私のような何かをする必要が私のshow.blade.phpビューで:

json_decode($item->serialized_item) 

を今、私はちょうどきれいに物事を保つために別のビューをインポートしていますが、私はこれがベストだとは思いません方法。

<?php 
    $foo = json_decode($item->serialized_item, true); 
?> 

<p>{{$foo['quantity']}}</p> // 5 

detail.blade.php

cart.blade.php

... 
@include('detail', ['attributes' => item->serialized_item]) 

この方法では動作しますが、それはハックのように思えます。

答えて

0

あなたはsetSubAttributes()メソッドを作成するためにあなたのitemモデルを変更する必要があります。

public function setAttributes() { 
    $attributes = json_decode($this->serialized_item, true); 

    $this->id = $attributes ['id']; 
    $this->quantity = $attributes ['quantity']; 
} 

をとビューの日付を準備するために、あなたのコントローラでそれを呼び出す:

$cart = Cart::findOrFail($id); 
$items = $cart->items()->get(); 

foreach ($items as &$item) { 
    $item->setAttributes(); 
} 

あなたができるように、 detail.blade.phpビューで属性を直接呼び出してください。

EDIT

私はそれを試していないが、あなたは、コントローラの中にそれを呼び出すために避けることができるようにあなたも、まっすぐにあなたのitemモデルのコンストラクタにそれを呼び出すことができます。

public function __construct() 
{ 
    $this->setAttributes(); 
} 
+0

も、 $ fooは実際には大きなオブジェクトであり、小さなオブジェクトがたくさんあります。これらのオブジェクト内には、シリアライズされた属性があります。したがって、 'item'内の' foreach(foo as item) 'のようなものが直列化された属性です。私はそれが理にかなったことを願う私はショッピングカートを使って作業していますので、 '$ foo'を自分のカートと考えてください。 – Damon

+0

各ファイルのコードロジックを編集し、より良い考えを与えることができますか?いくつかの偽のデータが入っている欠落している行。 –

+0

確かに!あなたのお手伝いをしていただきありがとうございます。 – Damon

関連する問題