【发布时间】:2021-10-14 19:51:46
【问题描述】:
拥有 PHP、Symfony 4.4、JMS 序列化程序和 json 有效负载(请求正文):
{
"quantity": 1,
"product": {
"sku": "bla"
},
"myId": {
"id": "0010N00005GcOhhQAF"
}
}
此有效负载被发送到我的端点,并且所有内容都正确反序列化为正确的结果 CustomRequest 对象 - 也正确创建了 Product 和 MyId 等嵌套对象。对于Product 对象来说没问题,因为Product 具有具有多个属性的复杂结构。
但我想要实现的是让myId 的输入更容易。我想拥有它而不是:
"myId": {
"id": "0010N00005GcOhhQAF"
}
这很简单:
"myId": "0010N00005GcOhhQAF"
您可能会问为什么我有简单 id 的课程。它不是简单的 id,它内部有一些特殊的验证和业务逻辑,并且在所有应用程序中都使用,所以为了验证目的,最好有一个对象。
可以说,我希望我的反序列化器自动将那个简单的 id 字符串带入 MyId 类的构造函数中,并返回该对象。 MyId 类是简单的类,例如:
class MyId
{
/**
* @AppAssert\MyId()
*/
private ?string $value = null;
public function __construct(string $value)
{
$this->value = $value;
}
public function __toString()
{
return $this->value;
}
}
仅供参考:我在生成的 CustomRequest 对象中尝试了此注释,但它不起作用
/**
* @Serializer\Type("App\Model\MyId")
*/
private ?MyId $myId = null;
编辑:另一个重要部分:这是端点如何自动将请求正文转换为CustomRequest 对象。在这里你可以看到,我使用的是ParamConverter。
/**
* @Rest\Post("/product")
* @ParamConverter("customRequest", options={
* "validator"={"groups"={"Default","product"="create"}},
* })
*/
public function postCreateProductAction(CustomRequest $customRequest) {
// ...
}
问题是:如何使用 JMS Serializer 和 Symfony 来使其工作。获取简单的一个字符串以原子方式将其传递给构造函数并从中生成和对象。这甚至可能吗?谢谢
【问题讨论】:
标签: php symfony json-deserialization jsonserializer jms-serializer