使用doctrine存储序列化对象

时间:2014-04-29 10:40:33

标签: php symfony serialization doctrine-orm

我在使用doctrine存储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)));

当我使用它时,存储了所有序列化字符串,我可以正确地反序列化它。你知道什么是错的吗?

-edit -

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

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

2 个答案:

答案 0 :(得分:2)

我假设您使用注释作为doctrine配置。然后改变你的实体:

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

然后在控制器内部序列化/反序列化对象是没有必要的,doctrine会处理那个

// 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);
// ...

祝你好运!

答案 1 :(得分:0)

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

我本人将改为使用JsonObjectType。