gpt4 book ai didi

symfony - 如何使用 JMSSerializerBundle 创建良好的超媒体格式?

转载 作者:行者123 更新时间:2023-12-03 06:11:20 26 4
gpt4 key购买 nike

假设我想创建一个如下所示的 XML 响应:

<?xml version="1.0" encoding="utf‐8"?>
<product xmlns="urn:com.acme.prods" xmlns:atom="http://www.w3.org/2005/xlink">
<id>1234</id>
<name>Red Stapler</name>
<price currency="EUR">3.14</price>
<atom:link rel="payment" type="application/com.acme.shop+xml"
href="http://acme.com/products/1234/payment" />
</product>

给定一个如下所示的域模型:

<?php
// Product.php
namespace Acme\Bundle\ProductBundle\Entity;
use Acme\Bundle\ProductBundle\Money\Money;

class Product
{
/**
* @var integer
*/
private $id;

/**
* @var string
*/
private $name;

/**
* @var Money
*/
private $price;

[..]
}

以及金钱级别:

<?php
// Money.php
namespace Acme\Bundle\ProductBundle\Money;

class Money
{
/**
* @var string
*/
private $currency;
/**
*
*/
private $amount;
}

现在,回答我的问题。创建如下所示的响应非常简单

<?xml version="1.0" encoding="utf‐8"?>
<product>
<id>1234</id>
<name>Red Stapler</name>
<price currency="EUR">3.14</price>
</product>

使用注释、XML 或 YAML 告诉 JMSSerializerBundle 如何序列化 Product 对象。然而,xmlns:atom<atom:link>条目不应由实体指定,因为它不应该有如何位置的概念。您还可以想象更多具有不同 rel 的链接- 属性,例如 edit .
我想到的一个解决方案是一种服务,该服务监听特定对象的序列化事件,并根据需要添加这些属性和标签。该服务可以使用 DI 来获取 Request , Router -service 等以适合请求格式的格式生成这些链接。即在 XML 响应中,它可以将适当的类型设置为 application/media-format+xml ,而在 json-response 中,它可以生成类似的内容

"links": [
{
"rel": "payment",
"type": "application/media-format+json",
"href": "[...]"
}
]

现在,在 the documentation for JMSSerializerBundle ,我找到 @PreSerialize 的注释,和@PostSerialize ,但它们似乎只能调用正在序列化的对象上的方法。
有谁知道如何/是否可以实现这一点?或者我是否必须使用模板引擎(例如 Twig)并手动创建 XML 响应?

最佳答案

单独的 Serializer Bundle 可能不足以应对这种情况,因为它只涉及序列化和反序列化,而不是更复杂的语义任务。

我建议调查FSCHateoasBundle为您的 API 实现漂亮的超媒体格式。

关于symfony - 如何使用 JMSSerializerBundle 创建良好的超媒体格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12407172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com