我现在有一个在symfony 4.4上运行的项目,它需要在几个端点中以XML形式返回数据。
所以我一直在尝试序列化一个包含来自另一个实体的对象数组的实体,就像这样
public class Ticket {
private string $uuid;
/** @var Product[]|array $products **/
private array $products;
}
和产品类:
public class Product {
private string $uuid;
private DateTime $startDate;
*... getters and setters...*
}
我希望响应是这样的:
<ticket>
<uuid>1234567890</uuid>
<products>
<product>
<uuid>PROD_CAM_1</uuid>
<startDate>2020-01-04</startDate>
</product>
<product>
<uuid>PROD_CAP_2</uuid>
<startDate>2019-04-21</startDate>
</product>
</products>
</ticket>
但是我得到的却是:
<ticket>
<uuid>1234567890</uuid>
<product>
<uuid>PROD_CAM_1</uuid>
<startDate>2020-01-04</startDate>
</product>
<product>
<uuid>PROD_CAP_2</uuid>
<startDate>2019-04-21</startDate>
</product>
</ticket>
我的序列化器配置没有什么特别的,这是我在服务中指定的唯一东西。在datetime上下文中,Yaml是:
SymfonyComponentSerializerNormalizerDateTimeNormalizer:
arguments:
$defaultContext:
datetime_format: 'Y-m-d'
我只需将序列化器服务注入到我的控制器中,并执行以下操作将其转换为xml:
$this->serializer->serialize($data,'xml',['xml_encoding' => 'utf-8']);
,其中$data是Ticket
的数组我错过了什么?symfony文档帮不上什么忙。
这是一个解决方案。
我将数组封装在Products类中,因此实体保留为:
public class Ticket {
private string $uuid;
/** @var Products $products **/
private Products $products;
}
新的Products类保留为:
class Products
{
/**
* @var array $products
* @SerializedName("product")
*/
private array $products = [];
/**
* @return array
*/
public function getProducts(): array
{
return $this->products;
}
/**
* @param array $products
*/
public function setProducts(array $products): void
{
$this->products = $products;
}
public function addProduct(Product $product): void
{
$this->products[] = $product;
}
}
其他内容保持不变,这将输出所需的XML结构。