У меня есть класс корзины покупок, который я хочу сериализовать для хранения в переменной сеанса.
Мой класс корзины
namespace Application\Model\Cart;
use Application\Model\AbstractModel;
use Zend\ServiceManager\ServiceManager;
use Application\Model\Cart\Product;
use Application\Model\Cart\ProductOptions;
use Application\Entity\Products;
class Cart extends AbstractModel
{
protected $products;
protected $totalIncVat;
protected $totalExVat;
public function __construct(ServiceManager $serviceManager = NULL)
{
parent::__construct($serviceManager);
$this->products = array();
$product = new Product();
$product->setProductId(1);
$option = new ProductOptions();
$product->addOption($option);
$this->products[] = $product;
}
public function __sleep()
{
return $this->products;
}
}
Как можно видеть в конструкторе, я добавляю тестовый продукт и продукт. Классы продуктов хранятся в массиве $this->products
.
Мой класс продуктов
namespace Application\Model\Cart;
use Application\Model\Cart\ProductOptions;
class Product
{
protected $productId;
protected $title;
protected $priceEachIncVat;
protected $priceEachVat;
protected $vat;
protected $qty;
protected $total;
protected $options;
public function __construct()
{
$this->options = array();
}
public function getProductId()
{
return $this->productId;
}
public function getTitle()
{
return $this->title;
}
public function getPriceEachIncVat()
{
return $this->priceEachIncVat;
}
public function getPriceEachVat()
{
return $this->priceEachVat;
}
public function getVat()
{
return $this->vat;
}
public function getQty()
{
return $this->qty;
}
public function getTotal()
{
return $this->total;
}
public function getOptions()
{
return $this->options;
}
public function setProductId($productId)
{
$this->productId = $productId;
return $this;
}
public function setTitle($title)
{
$this->title = $title;
return $this;
}
public function setPriceEachIncVat($priceEachIncVat)
{
$this->priceEachIncVat = $priceEachIncVat;
return $this;
}
public function setPriceEachVat($priceEachVat)
{
$this->priceEachVat = $priceEachVat;
return $this;
}
public function setVat($vat)
{
$this->vat = $vat;
return $this;
}
public function setQty($qty)
{
$this->qty = $qty;
return $this;
}
public function setTotal($total)
{
$this->total = $total;
return $this;
}
public function setOptions(Array $options)
{
$this->options = $options;
return $this;
}
public function addOption(ProductOptions $option)
{
$this->options[] = $option;
return $this;
}
}
И, наконец, мой класс продуктов
namespace Application\Model\Cart;
class ProductOptions
{
protected $optionId;
protected $name;
protected $price;
protected $valueId;
protected $value;
public function getOptionId()
{
return $this->optionId;
}
public function getName()
{
return $this->name;
}
public function getPrice()
{
return $this->price;
}
public function getValueId()
{
return $this->valueId;
}
public function getValue()
{
return $this->value;
}
public function setOptionId($optionId)
{
$this->optionId = $optionId;
return $this;
}
public function setName($name)
{
$this->name = $name;
return $this;
}
public function setPrice($price)
{
$this->price = $price;
return $this;
}
public function setValueId($valueId)
{
$this->valueId = $valueId;
return $this;
}
public function setValue($value)
{
$this->value = $value;
return $this;
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что классы не сериализуются должным образом.
$serializer = new \Zend\Serializer\Adapter\PhpSerialize();
$serialized = $serializer->serialize($cart);
$cart = $serializer->unserialize($serialized);
Когда я удаляю тестовый продукт из конструктора корзины, все работает хорошо. Проблема с массивом продуктов.
Ошибка, которую я получаю, является unserialize(): Ошибка при смещении 40 из 41 байт.
Возвращенная строка
O: 27: "Применение\Модель\Корзина\Корзина": 1: {N}
Кто-нибудь знает, что мне не хватает?
Спасибо заранее.
Я понял. Метод магии сна в классе корзины должен содержать return array('products');