gpt4 book ai didi

json - 如何使用 FOSRestBundle 和 symfony 表单处理嵌套 json

转载 作者:行者123 更新时间:2023-12-01 17:15:32 24 4
gpt4 key购买 nike

通过嵌套 json,我的意思是将地址数据保存在自己的“地址”数组中:

{
"user": {
"id": 999,
"username": "xxxx",
"email": "xxxx@example.org",
"address": {
"street": "13th avenue",
"place": 12
}
}
}

而不是平的

{
"user": {
"id": 999,
"username": "xxxx",
"email": "xxxx@example.org",
"street": "13th avenue",
"place": 12
}
}

平一加工精细there使用用户实体及其属性:“id”、“用户名”和“电子邮件”。它使用 symfony 表单功能得到了很好的验证:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('username');
$builder->add('email', 'email');
$builder->add('password', 'password');
$builder->add('street');
$builder->add('place');
}

我希望将“街道”和“地点”作为用户实体中的属性,使用原则将其全部存储在数据库中的一个用户表中。但我得到的json来自第三方,所以我无法修改它。

是否有任何方法可以构建表单,以便它可以正确验证带有“地址”字段的 json,同时仍然能够将所有用户数据保留在一个表中?

最佳答案

这是一个很好的问题。我想到的一种解决方案是制作未映射的表单并使用表单事件手动绑定(bind)数据,例如:

public function buildForm(FormBuilderInterface $builder, array $options)
{
// Make a "nested" address form to resemble JSON structure
$addressBuilder = $builder->create('address', 'form')
->add('place')
->add('street');

$builder->add('username');
$builder->add('email', 'email');
$builder->add('password', 'password');
// add that subform to main form, and make it unmapped
// this will tell symfony not to bind any data to user object
$builder->add($addressBuilder, null, ['mapped' => false]);

// Once form is submitted, get data from address form
// and set it on user object manually
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
$user = $event->getData();
$addressData = $event->getForm()->get('address')->getData();

$user->setStreet($addressData['street']);
$user->setPlace($addressData['place']);
})
}

关于json - 如何使用 FOSRestBundle 和 symfony 表单处理嵌套 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34690274/

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