【问题标题】:Storing serialized object with doctrine用学说存储序列化对象
【发布时间】:2014-06-15 06:03:55
【问题描述】:

我在用教义存储 php 序列化对象时遇到了一些问题, 当我使用以下代码存储时:

$item = new \Company\MyBundle\Entity\Frontend\table();
$item->setData(serialize($myPhpObject));
$this->_em->persist($item);
$this->_em->flush();

然后在另一个例子中:

$item = $this->_em->getRepository('MyBundle:frontend\table')->findOneById(...);
echo $item->getData(); // display only a part of the serialized object

我以某种方式找到了解决办法,但我想还有更好的办法:

$item->setData(json_encode(serialize($myPhpObject)));

当我使用它时,所有序列化的字符串都会被存储,我可以正确地反序列化它。你知道哪里出了问题吗?

-编辑-

这是从列数据设置的示例:

data:
    type: string
    length: null
    fixed: false
    nullable: true
    column: data

【问题讨论】:

  • 请提供有关您正在序列化的对象的更多详细信息,因为有很多解决方案取决于您的对象。拜托,php.net/manual/en/function.serialize.php 有很好的手册,在 cmets 你可以找到很多案例
  • 你试过使用Doctrine内置的object字段类型吗?
  • 你在getData()之后反序列化了吗?
  • @pomaxa 对象是 Swift 邮件库中的 Swift_Mime_Message。
  • @kix 我必须看看。

标签: php symfony serialization doctrine-orm


【解决方案1】:

我假设您使用注释作为学说配置。然后更改您的实体:

// src/Company/MyBundle/Entity/Frontend/table.php
// ...
/**
 * @var resource
 *
 * (non-PHPdoc)
 * @ORM\Column(name="data", type="object")
 */
private $data;
// ...

然后在控制器内部不需要序列化/反序列化对象,学说会处理

// src/Company/MyBundle/Controller/SomeController.php
// ...
// write
$item = new \Company\MyBundle\Entity\Frontend\table();
$item->setData($myPhpObject);
$this->_em->persist($item);
$this->_em->flush();
// ...
// read
$item = $this->getDoctrine()->getRepository('CompanyMyBundle:table')->find($id);
$myPhpObject = $item->getData();
var_dump($myPhpObject);
// ...

祝你好运!

【讨论】:

    【解决方案2】:

    使用ArrayType(在实体注释中又名array)或ObjectType(在实体注释中又名object)用于Doctrine 类型可能会因为这个问题而存在一些潜在的安全问题(导致拒绝服务)( https://github.com/doctrine/dbal/issues/3289)

    我自己会改用 JsonObjectType。

    【讨论】:

    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多