Laravel:我如何在视图中使用json_decode?

时间:2016-06-17 14:10:45

标签: laravel-5.2 laravel-blade

我正在尝试找出从我的刀片模板中的序列化数组中获取属性的最佳方法。

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也有序列化属性,其中包含sku,重量,数量等内容。

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

因此,在show.blade.php视图中,我需要执行以下操作:

json_decode($item->serialized_item)

现在我只是导入另一个视图来帮助保持清洁,但我不认为这是最好的方法。

cart.blade.php

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

detail.blade.php

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

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

这种方法有效,但看起来像是黑客。

1 个答案:

答案 0 :(得分:0)

您需要更改item模型以创建setSubAttributes()方法:

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 视图中调用您的属性。

修改

我没有尝试过,但您甚至可以直接将其调用到item模型构造函数中,这样就可以避免在控制器中调用它:

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