下面是我的doctrine entity/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 bundle配置,我可以轻松地将一个"Command"对象序列化为JSON,如:
{
"id": "1",
"customerName": "Logan",
"customerNickname": "Wolverine",
"..."
}
但是,在我的情况下,我需要的输出JSON格式是强加的,我希望有一个子对象结构,如:
{
"id": "1",
"customer":
{
"customerName": "Logan",
"customerNickname": "Wolverine",
}
}
因为我有很多类在这种情况下,我宁愿不改变我的类结构(php端)
除了"pre|post-serialize"事件(看起来有点重),我没有在官方JMS Serializer bundle中找到解决方案。
最简单的解决方法是什么?
为了记录,您可能应该使用pre/post序列化,但我找到了另一种方法。首先,我启用了读取元数据:
# 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
然后我在我的User实体中创建了一个方法,它以正确的格式返回我想要的数据。对你来说,像这样:
public function getCustomer()
{
return array(
'customerName' => $this->getCustomerName(),
'customerNickname' => $this->getCustomerNickname()
);
}
您可以使用VirtualProperty注释创建一个虚拟属性,而不是序列化您的两个属性。
/**
* @Serializer'VirtualProperty
* @Serializer'SerializedName("customer")
*
* @return array
*/
public function getCustomer()
{
return [
'customerName' => $this->customerName,
'customerNickname' => $this->customerNickname
];
}