Symfony 4:$form->getData() 返回空数组,其中相同的数组填充在 $request->request->all()

问题描述 投票:0回答:2

我现在面临一个奇怪的问题

这是我的代码:

$data = [];

$form = $this->createFormBuilder($data, ["allow_extra_fields" => true,])
    ->add("attributes", FormType::class, ["allow_extra_fields" => true,])
    ->add('save', SubmitType::class, ['label' => 'Save'])
    ->getForm();


$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    $data = $form->getData();
    return new Response("<pre>".print_r($request->request->all(),1).print_r($data,1)."</pre>");
}

如您所见,出于调试目的,我显示了整个 $request->request 和 $form->getData()。

令人惊讶的是,第一个完全充满了正确的信息,第二个是空的。

我有点懒惰手动审查这个数组中的信息(公司信息),所以这里是结果的审查屏幕截图:

知道为什么表单没有被解析吗?

谢谢!

forms symfony post request symfony4
2个回答
1
投票

标准 symfony

Form
类将额外数据存储在一个位置,即
extraData
属性,可以通过
getExtraData()
访问该属性。这对于子表单来说显然不是特别有用(那么可能必须在子表单上调用它)。我认为,
allow_extra_fields
标志主要是为了防止表单在出现额外数据的情况下出错,因为没有人会使用
Form
类来表示 no 字段(因此没有验证,也没有首先使用表单类的好处)。所以你的用法是......“创新”。

正确的方法是很好地定义attributes

在表单中可以具有的结构(可以选择将
required
设置为
false
),解决人们尝试的大多数
实际问题用表格来解决。 - 这就是表单的含义,一个递归处理字段/子表单的对象。如果你只是想忽略/规避它......好吧

不正确的方法是,可能教授某种表单类型 - 通过一些数据映射器或数据转换器或事件处理东西 - 来处理提供的任意数据。

最简单的方法:只需使用

$request->request->all()

 可能是解串器。


0
投票
我正在使用 Symfony 6.4,我也遇到了类似的问题。

$myObject = $form->getData(); return new Response(json_encode(["aaa" => $myObject]));
返回空对象,如 

{"aaa":{}}


但是

$myObject = $form->getData(); $variable = $myObject->getMyProperty(); return new Response(json_encode(["aaa" => $variable]));
返回我已提交的值。所以,我猜它没有序列化器(将其转换为字符串),我们认为它是空的,而实际上有一个对象。我相信,如果您或我在 IDE 中使用调试器,我们会看到该对象在那里。

© www.soinside.com 2019 - 2024. All rights reserved.