将嵌套的 Json 发送到 Symfony 表单

Posted

技术标签:

【中文标题】将嵌套的 Json 发送到 Symfony 表单【英文标题】:Send Nested Json to a Symfony Form 【发布时间】:2020-12-11 12:33:46 【问题描述】:

我有一个嵌套的 JSON 对象,我试图将它发送到使用 FOSRestBundle 的 Symfony API。


    "firstName": "John",
    "lastName": "Doe",
    "email": "john.doe@gmail.com",
    "responses": [
        "1": "D",
        "2": "B",
        "3": "C",
        "4": "F"
    ]

但我收到以下错误:


"code": 400,
"message": "Validation Failed",
"errors": 
    "children": 
        "firstName": [],
        "lastName": [],
        "email": [],
        "responses": 
            "errors": [
                "This value is not valid."
            ]
        
    

这是我的表单类型:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)

    $builder
        ->add('firstName',  TextType::class, [
            'constraints' => [
                new NotBlank(),
                new Length(['min' => 3]),
            ]
        ])
        ->add('lastName',  TextType::class, [
            'constraints' => [
                new NotBlank(),
                new Length(['min' => 3]),
            ]
        ])
        ->add('email',  TextType::class, [
            'constraints' => [
                new NotBlank(),
                new Length(['min' => 3]),
            ]
        ])
        ->add('responses');
    ;

这是我的控制器方法:

/**
 * @Rest\Post(
 *     path="/api/report"
 * )
 * @param Request $request
 * @return Response
 */
public function post(Request $request)

    $form = $this->createForm(ReportType::class);
    $form->submit($request->request->all());

    if (false === $form->isValid()) 
        return $this->handleView(
            $this->view($form)
        );
    

    return $this->handleView(
        $this->view(
            [
                'status' => 'ok',
            ],
            Response::HTTP_CREATED
        )
    );

我很困惑,因为没有表单验证 $responses。

我已尝试实施此链接上提供的解决方案: How to process nested json with FOSRestBundle and symfony forms

但我收到错误消息“您不能将子项添加到简单表单中。也许您应该将选项“compound”设置为 true?

任何人都可以提供有关如何解决此问题的建议吗?

【问题讨论】:

自动“表单验证”来自表单类型,这取决于表单的定义方式。报告实体的响应属性(getter/setter)可能会对此有所了解。如果不设置表单类型,则会猜测表单类型。 $request->request->all 可能会反序列化整个对象,因此您有一个用于响应字段的数组数组,这可能不适用于自动猜测的表单类型... 【参考方案1】:

您好,我认为问题在于响应。尝试使用 CollectionType。在此示例中,对集合中的每个对象使用 ChoiceType。见这里:https://symfony.com/doc/current/reference/forms/types/collection.html#entry-options

->add('responses', CollectionType::class, [
 'entry_type'   => ChoiceType::class,
 'entry_options'  => [
     'choices'  => [
         '1' => 'D',
         '2' => 'A',
     ],
 ],
]);

【讨论】:

以上是关于将嵌套的 Json 发送到 Symfony 表单的主要内容,如果未能解决你的问题,请参考以下文章

将 HTML 数据从表单发送到 JSON 文件 (Ajax/Jquery)

将字符串从数据库从一个表单发送到另一个表单

如何将具有嵌套属性的 JSON 对象反序列化为 Symfony 实体?

发送 json 数据时的空指针

通过 PhP 将 HTML 表单发送到电子邮件时遇到问题 [重复]

我无法将发布请求从反应表单发送到烧瓶服务器 [重复]