Symfony2 / JMS Serializer - 如何管理不同的对象结构?

时间:2014-08-07 16:33:54

标签: php json symfony jmsserializerbundle

这是我的学说实体/ php类的简化版本:

/**
 * @ORM\Entity()
 */
class Command{

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $customerName;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $customerNickname;

    // Other fields ...
}

使用基本的JMS Serialier软件包配置,我可以轻松地将一个“Command”对象序列化为JSON,如:

{
   "id": "1",
   "customerName": "Logan",
   "customerNickname": "Wolverine",
   "..."
}

但是,在我的情况下,我需要输出JSON格式,我希望有一个子对象结构,如:

{
   "id": "1",
   "customer":
   {
       "customerName": "Logan",
       "customerNickname": "Wolverine",
   }
}

因为在这种情况下我有很多课程,我宁愿不改变我的课程结构(php方面)

除了“pre | post-serialize”事件(对于这样的事情似乎有点重),我没有在官方JMS Serializer包中找到解决方案。

最简单的解决办法是什么?

祝你好运

2 个答案:

答案 0 :(得分:3)

为了记录,您应该使用前/后序列化,但我找到了另一种解决方法。首先,我启用了元数据的读取:

# app/config/config.yml
jms_serializer:
    metadata:
        auto_detection: true

然后创建了文件夹App\CoreBundle\Resources\config\serializer\并创建了相关文件yaml(例如Entity.User.yml)。

然后我排除了所有内容,并使用virtual_properties格式化数据的方式。

App\CoreBundle\Entity\User:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
    virtual_properties:
            getCustomer:
                serialized_name: customer

然后我在我的用户实体中创建了一个方法,该方法以正确的格式返回我想要的数据。对你来说,像是:

public function getCustomer()
{
    return array(
        'customerName' => $this->getCustomerName(),
        'customerNickname' => $this->getCustomerNickname()
    );
}

答案 1 :(得分:3)

您可以创建一个带有VirtualProperty注释的虚拟属性,而不是序列化您的两个属性。

/**
 * @Serializer\VirtualProperty
 * @Serializer\SerializedName("customer")
 *
 * @return array
 */
public function getCustomer()
{
    return [
        'customerName' => $this->customerName, 
        'customerNickname' => $this->customerNickname
    ];
}