Symfony2 ObjectNormalizer非规范化回调

时间:2015-07-13 10:54:52

标签: symfony serialization doctrine-orm serializer

是否可以在setCallbacks上使用Symfony\Component\Serializer\Normalizer\ObjectNormalizer,在调用Symfony\Component\Serializer\Serializer.deserialize()时将调整后的标准值转换回对象时调用?

我知道反向是可能的,因为在调用Symfony\Component\Serializer\Serializer.serialize()时可以对对象进行规范化。我只是不知道如何进行反向归一化。

setCallbacksFoo转换为Id的实体的序列化示例:

    $encoder = new JsonEncoder();
    $normalizer = new ObjectNormalizer();
    $normalizer->setCallbacks(array(
        'foo' => function ($foo) {
            return $foo instanceof Foo
                ? $foo->getId()
                : null;
        },
    ));
    $serializer = new Serializer(array($normalizer), array($encoder));

    $json = $serializer->serialize($entity, 'json');

我想做的反面:

$em = static::getEntityManager();

    $encoder = new JsonEncoder();
    $normalizer = new ObjectNormalizer();
    $normalizer->setCallbacks(array(
        'foo' => function ($foo) use($em) {
            return !is_null($foo)
                ? $em->getReference('\Entity\Foo', $foo)
                : null;
        },
    ));
    $serializer = new Serializer(array($normalizer), array($encoder));

    return $serializer->deserialize($entity, $classname, 'json');

我得到的错误:

Catchable fatal error: Argument 1 passed to \Entity\Bar::setFoo() must be an instance of \Entity\Foo, integer given

或者是否可以在deserialize之前执行预备步骤?

1 个答案:

答案 0 :(得分:-1)

请检查here,看看确切的getReference

  

无法使getReference()检查数据库是否存在引用的对象。

如果您想要实现deserealize,则必须使用$em->getRepository('\Entity\Foo')->find($foo)