启用处理程序时JMS Serializer的NULL响应

时间:2016-02-15 18:33:05

标签: symfony serialization null jmsserializerbundle

(Symfony + JMS Serializer)

我有以下服务:

my_serializer:
        class: MySerializer
        tags:
            - { name: jms_serializer.handler, type: MyClass, direction: serialization, format: json, method: serializeMyClassToJson }

服务类只包含一个方法:

public function serializeMyClassToJson(
    JsonSerializationVisitor $visitor,
    MyClass $myObject,
    array $type,
    Context $context
) {
    return array(
        'id' => $myObject->getId()
         // .. and so on
    );
}

当我的处理程序启用时,我在这个类的任何对象上调用serialize()时得到一个NULL结果(即在JMS Serializer中注册 - 如果我删除它,一切正常):

$this->container->get('jms_serializer')->serialize($myObject, 'json'); // null

需要注意的一些事项:

  1. 我的序列化方法被调用,我确信我从中返回了正确的数组(显然,我测试了几个虚拟数组 - 但结果是一样的。)

  2. 奇怪的是,当MyClass是另一个Doctrine托管实体的一部分并且我序列化该实体时,序列化有效(MySecondClassOneToOneMyClass的关系):

    [...]->serialize($mySecondObject, 'json'); // includes the correct JSON result for $myObject
    [...]->serialize($mySecondObject->getMyObject(), 'json'); // null
    
  3. 我没有为MyClass中的属性定义任何注释。

  4. 那么,我可能错过了我的处理程序的一些注释或回调?

1 个答案:

答案 0 :(得分:2)

解决方法(虽然不是我的问题的答案)似乎是对我的处理程序回调的以下调整:

public function serializeMyClassToJson(
    JsonSerializationVisitor $visitor,
    MyClass $myObject,
    array $type,
    Context $context
) {
    $result = array(
        'id' => $myObject->getId()
         // .. and so on
    );

    // Populate the root element if it's NULL
    // (with this change, the JSON output seems to be correct)
    if ($visitor->getRoot() === null) {
        $visitor->setRoot($result);
    }

    return $result;
}