【问题标题】:Laravel: How can I use json_decode in my view?Laravel:如何在我的视图中使用 json_decode?
【发布时间】:2016-06-17 23:41:30
【问题描述】:

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

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

这种方法有效,但它看起来像个 hack。

【问题讨论】:

    标签: laravel-5.2 laravel-blade


    【解决方案1】:

    您需要更改您的 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();
    }
    

    【讨论】:

    • 嗯,$foo 实际上是一个较大的对象,其中包含许多较小的对象。它在这些对象中是序列化的属性。所以像foreach(foo as item) 这样的东西在item 中是序列化的属性。我希望这是有道理的。我正在使用购物车,因此请将 $foo 视为我的购物车。
    • 您能否编辑并更好地了解每个文件的代码逻辑?只是缺少带有一些虚假数据的行。
    • 没问题!感谢您对伊万的帮助。
    • 我编辑了我的答案,但你应该使用database-models relationships 来避免像这样的困难。我建议你看看一个很好的例子是LaravelShoppingcart
    • 我跟着你去。我继承了这个项目,所以我必须用我被处理的手工作。感谢您的帮助!
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2018-08-22
    相关资源
    最近更新 更多