2016-06-17 2 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 также имеет сериализованный атрибут, который содержит такие вещи, как 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 

Этот метод работает, но это, кажется, как взломать.

ответ

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.

EDIT

Я не пробовал, но вы могли бы даже назвать его прямо в вашей модели конструктора item, так что вы можете избежать называть его в контроллере:

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

хорошо, $ foo на самом деле является более крупным объектом со множеством меньших объектов. Его внутри этих объектов лежит сериализованный атрибут. Итак, что-то вроде 'foreach (foo as item)', тогда внутри 'item' является сериализованным атрибутом. Я надеюсь, что в этом есть смысл. Я работаю с корзиной покупок, поэтому думаю о '$ foo' как о моей корзине. – Damon

+0

Можете ли вы редактировать и лучше понимать логику кода для каждого файла? Просто недостающие строки с некоторыми поддельными данными. –

+0

Несомненно! Спасибо вам за помощь. – Damon

Смежные вопросы