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

标签 json symfony fosrestbundle

通过嵌套 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/

相关文章:

symfony - 请勿将 ParamConverter 与 "fos_rest.request_body"转换器一起使用

Symfony2 防火墙和 FOSRestBundle

javascript - 不存在的行上出现意外的 token }

json - Swift - 具有基本身份验证的 Http-Request

templates - 如何在 Symfony2/Twig 模板中包含原始 HTML 文件?

.htaccess - symfony2重写规则.htaccess app.php

symfony - mopabootstrap bundle 和 symfony2 问题

javascript - 什么是 JSON VM747 :1 error that happens during JSON parsing?

html - 使用 BeautifulSoup 将以 HTML 编码的 JSON 转换为 JSON

jquery - 使用Symfony,jQuery,FOSRestBundle和NelmioCorsBundle进行CORS