是否可以在同一属性上有一个类,有2种类型(1个用于序列化,1个用于反序列化)?
例如,我使用的API允许我将地址作为字符串发送,并且我收到与对象相同的地址。像这样:
请求:
{
"address": "12 rue rivoli, 75001 Paris"
}
响应
{
"address": {
"street": "12 Rue de Rivoli",
"postcode": "75004",
"city": "Paris",
"country": "France"
}
}
是的,您可以使用@Accessor
Annotation Tag of the JmsSerializer实现此目的:
可以在属性上定义此批注,以指定应调用哪个公共方法来检索,或设置给定属性的值:
在您的实体中,这可能如下所示:
# AppBundle/Entity/User
<?php
use JMS\Serializer\Annotation\Accessor;
class User
{
/**
* @var AppBundle\Entity\Address
*
* @Accessor(getter="getAddressAsString",setter="setAddress")
*/
private $address;
// ...
public function getAddressAsString()
{
return sprintf('%s, %s %s', $this->address->getStreet(), $this->address->Postcode(), $this->address->getCity()),
}
public function setAddress(Address $address)
{
$this->address = $address;
}
}
所以,这是一个适合我的解决方案:
serializer.pre_deserialize
事件上实现订阅者/侦听者,即
class MyPreDeserializationSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
[
'event' => 'serializer.pre_deserialize',
'method' => 'onPreDeserialize',
'class' => Video::class,
'format' => 'json',
]
];
}
public function onPreDeserialize(PreDeserializeEvent $event)
{
$data = $event->getData();
$data['address'] = implode(', ', $data['address']);
$event->setData($data);
}
}