Dav*_*ank 9 php session entity symfony
我想将我的一个实体对象保存到会话中,但是当我这样做时,我得到以下两个错误:
例外: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);
Run Code Online (Sandbox Code Playgroud)
我怎么能把它弄好?
谢谢.
更新 在Rowgm的帮助下,我可以通过设置受保护而不是私有的属性来解决此问题.我唯一的问题是从会话中读取实体后EntityManager不知道它,如果我将对象(从会话)添加到另一个对象(它们之间存在OneToMany关系),它将无法工作.
<?php
$offer = $this->get('session')->get('offer');
$coupon = new Coupon();
$coupon->setOffer($offer);
$this->em->persist($coupon);
$this->em->flush();
Run Code Online (Sandbox Code Playgroud)
这会引发错误,因为优惠券有一个对象属性,根据EntityManager不在数据库中(实际上它在数据库中,我从数据库中放入会话).
<?php
$offer = $this->get('session')->get('offer');
echo $this->em->getUnitOfWork()->isInIdentityMap($offer) ? "yes":"no"; //result: no
Run Code Online (Sandbox Code Playgroud)
一种解决方案可以是:
$offer = $this->em->merge($offer);
但这似乎并不是最好的.我希望我的EntityManager能够感知存储在会话中的实体对象而不必每次都告诉它.任何的想法?
Row*_*ego 14
您可以通过将所有属性和关系从private设置为protected来序列化任何实体.
即使您已将所有属性设置为protected,您也可能遇到symfony2的常见问题:您必须重新生成已更改的实体的代理.为此,只需清除缓存即可.对于开发环境:
app/console cache:clear
即使"它包含许多外来对象,甚至包含外部实体的ArrayCollections",它也可以正常工作.
归档时间: |
|
查看次数: |
22019 次 |
最近记录: |