tôi muốn lưu một trong những thực thể của tôi đối tượng vào phiên giao dịch, nhưng như tôi đang làm như vậy, tôi nhận được hai lỗi sau đây:Symfony2 serialize thực thể đối tượng để phiên
Ngoại lệ: Symfony \ Bundle \ FrameworkBundle \ DataCollector \ RequestDataCollector :: serialize() phải trả lại một chuỗi hoặc NULL
và
ErrorException: Thông báo: nối tiếp ize(): "id" được trả về thành viên biến từ __sleep() nhưng không tồn tại trong /var/www/clients/client71/web256/web/_dev_fd/kkupon/vendor/symfony/src/Symfony/Component/HttpKernel /DataCollector/DataCollector.php dòng 29
mã của tôi đi như thế này:
$offer = $this->getEntityManager()->getRepository('KkuponMainBundle:Offer')->find($offer_id);
$request->getSession()->set('offer', $offer);
Làm sao tôi nhận được nó phải không?
Cảm ơn bạn.
CẬP NHẬT Với sự trợ giúp của Rowgm tôi có thể khắc phục sự cố này bằng cách đặt thuộc tính được bảo vệ thay vì riêng tư. Vấn đề duy nhất tôi gặp phải là sau khi đọc thực thể từ phiên mà EntityManager không biết về nó và nếu tôi thêm đối tượng (từ phiên) vào đối tượng khác (có mối quan hệ OneToMany giữa chúng), nó sẽ không công việc.
<?php
$offer = $this->get('session')->get('offer');
$coupon = new Coupon();
$coupon->setOffer($offer);
$this->em->persist($coupon);
$this->em->flush();
Điều này đặt ra một lỗi, vì phiếu giảm giá có một tài sản đối tượng mà theo EntityManager không có trong cơ sở dữ liệu (trên thực tế nó là trong DB, tôi đưa vào phiên giao dịch từ DB).
<?php
$offer = $this->get('session')->get('offer');
echo $this->em->getUnitOfWork()->isInIdentityMap($offer) ? "yes":"no"; //result: no
Một giải pháp có thể là: $offer = $this->em->merge($offer);
Nhưng điều này không có vẻ là tốt nhất. Tôi muốn EntityManager của tôi để cảm nhận các đối tượng thực thể được lưu trữ trong phiên mà không nói với nó mỗi lần. Bất kỳ ý tưởng nào?
Cảm ơn bạn, nó đã giúp rất nhiều. –
Xin vui lòng, nếu bạn có thể, hãy trả lời phần cập nhật của câu hỏi của tôi. –
Hãy suy nghĩ về nó: Nếu bạn lưu trữ tất cả các thực thể đó, bạn sẽ lưu trữ một đối tượng lớn trong dữ liệu phiên của bạn. Đối với môi trường develepment của bạn, nó không phải là một vấn đề. Nhưng nếu bạn có nhiều người dùng, nó là một sự lãng phí tài nguyên. Giải pháp rất đơn giản: lưu trữ id của đối tượng và sử dụng phương thức find() của kho lưu trữ để truy lục đối tượng. Cuối cùng, đó là điều tương tự. –