【发布时间】:2012-03-12 04:37:51
【问题描述】:
我想将我的一个实体对象保存到会话中,但在执行此操作时,出现以下两个错误:
例外: Symfony\Bundle\FrameworkBundle\DataCollector\RequestDataCollector::serialize() 必须返回一个字符串或NULL
和
ErrorException: 注意:serialize(): "id" 作为成员返回 来自 __sleep() 的变量,但不存在于 /var/www/clients/client71/web256/web/_dev_fd/kkupon/vendor/symfony/src/Symfony/Component/HttpKernel/DataCollector/DataCollector.php 第 29 行
我的代码是这样的:
$offer = $this->getEntityManager()->getRepository('KkuponMainBundle:Offer')->find($offer_id);
$request->getSession()->set('offer', $offer);
我怎样才能做到正确?
谢谢。
更新 在 Rowgm 的帮助下,我可以通过设置受保护而不是私有的属性来解决这个问题。我唯一的问题是在 读取 会话中的实体之后 EntityManager 不知道它,如果我将对象(来自会话)添加到另一个对象(它们之间存在 OneToMany 关系) ,它不会工作。
<?php
$offer = $this->get('session')->get('offer');
$coupon = new Coupon();
$coupon->setOffer($offer);
$this->em->persist($coupon);
$this->em->flush();
这会引发错误,因为根据 EntityManager 的说法,优惠券有一个对象属性不在数据库中(实际上它在数据库中,我从数据库中放入会话)。
<?php
$offer = $this->get('session')->get('offer');
echo $this->em->getUnitOfWork()->isInIdentityMap($offer) ? "yes":"no"; //result: no
一种解决方案可以是:
$offer = $this->em->merge($offer);
但这似乎不是最好的。我希望我的 EntityManager 能够感知存储在会话中的实体对象,而无需每次都告诉它。 有什么想法吗?
【问题讨论】:
标签: php session symfony entity