我现在面临一个奇怪的问题
这是我的代码:
$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()。
令人惊讶的是,第一个完全充满了正确的信息,第二个是空的。
我有点懒惰手动审查这个数组中的信息(公司信息),所以这里是结果的审查屏幕截图:
知道为什么表单没有被解析吗?
谢谢!
标准 symfony
Form
类将额外数据存储在一个位置,即 extraData
属性,可以通过 getExtraData()
访问该属性。这对于子表单来说显然不是特别有用(那么可能必须在子表单上调用它)。我认为, allow_extra_fields
标志主要是为了防止表单在出现额外数据的情况下出错,因为没有人会使用 Form
类来表示 no 字段(因此没有验证,也没有首先使用表单类的好处)。所以你的用法是......“创新”。
正确的方法是很好地定义attributes
在表单中可以具有的结构(可以选择将
required
设置为
false
),解决人们尝试的大多数实际问题用表格来解决。 - 这就是表单的含义,一个递归处理字段/子表单的对象。如果你只是想忽略/规避它......好吧 不正确的方法是,可能教授某种表单类型 - 通过一些数据映射器或数据转换器或事件处理东西 - 来处理提供的任意数据。
最简单的方法:只需使用
$request->request->all()
可能是解串器。
$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 中使用调试器,我们会看到该对象在那里。