symfony 2“;此表单不应包含额外字段。”;绑定REST请求数据时出现验证错误和问题
我正在尝试使用Symfony表单来处理REST请求 我在symfony表单中绑定请求数据时遇到了问题。在浏览Symfony的代码时,我发现它使用了symfony 2“;此表单不应包含额外字段。”;绑定REST请求数据时出现验证错误和问题,rest,symfony,symfony-forms,Rest,Symfony,Symfony Forms,我正在尝试使用Symfony表单来处理REST请求 我在symfony表单中绑定请求数据时遇到了问题。在浏览Symfony的代码时,我发现它使用了 HttpFoundationRequestHandler->handleRequest 在这方面,对于POST if ('' === $name) { $params = $request->request->all(); $files = $request->
HttpFoundationRequestHandler->handleRequest
在这方面,对于POST
if ('' === $name) {
$params = $request->request->all();
$files = $request->files->all();
} elseif ($request->request->has($name) || $request->files->has($name)) {
$default = $form->getConfig()->getCompound() ? array() : null;
$params = $request->request->get($name, $default);
$files = $request->files->get($name, $default);
} else {
// Don't submit the form if it is not present in the request
return;
}
若您看到上面的代码,若我们的表单类型类中有表单名称,它将尝试从请求中获取值,如下所示
$request->request->get($name)/$name是表单名
如果我们将表单呈现为HTML,这可能会起作用,但如果我们通过REST发布请求,它将找不到数据
为了让它工作,我们要么在请求中按照下面的方式命名它(我没有亲自测试过,但在某个地方读过)
只有在Request下面才不会绑定数据
{
'field1' => 'value1'
}
或者,我们必须从表单类型的getName中将表单名称返回为null,以便它使用根命名空间
public function getName()
{
return null;
}
若我们返回null,那个么它会产生另一个问题,若请求中除了表单字段之外还有其他参数,那个么它会给出验证错误
"This form should not contain extra fields."
理想情况下,表单应该只从表单中配置的请求中获取feild值,并且应该忽略它不知道的任何其他请求参数
e、 g.如果这是表格
class SampleFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('field1', 'text', array('constraints' => new NotBlank()))
->add('field2', 'password', array('constraints' => new NotBlank()));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'csrf_protection' => false,
));
}
public function getName()
{
return null;
}
}
但如果我发出请求
{
'field1' => 'value1',
'field2' => 'value2',
'field3' => 'value3'
}
它给出了上述验证错误。理想情况下,它应该忽略字段3并从请求中获取feild1和field2
如果我们比较NativeRequestHandler和HttpFoundationRequestHandler中的代码
NativeRequestHandler似乎处理得很好
if ('' === $name) {
$params = $_POST;
$files = $fixedFiles;
} elseif (array_key_exists($name, $_POST) || array_key_exists($name, $fixedFiles)) {
$default = $form->getConfig()->getCompound() ? array() : null;
$params = array_key_exists($name, $_POST) ? $_POST[$name] : $default;
$files = array_key_exists($name, $fixedFiles) ? $fixedFiles[$name] : $default;
} else {
// Don't submit the form if it is not present in the request
return;
}
其中,作为HttpFoundationRequestHandler不会
if ('' === $name) {
$params = $request->request->all();
$files = $request->files->all();
} elseif ($request->request->has($name) || $request->files->has($name)) {
$default = $form->getConfig()->getCompound() ? array() : null;
$params = $request->request->get($name, $default);
$files = $request->files->get($name, $default);
} else {
// Don't submit the form if it is not present in the request
return;
}
所以要么我们需要能够使用NativeRequestHandler,要么我们需要修复HttpFoundationRequestHandler
我看到下面的代码只适用于内容类型的文本请求(不适用于application/json)
但是使用$form->handleRequest($request)看起来更简单、更抽象
如果有其他更好更简单的解决方案,请提出建议。您在请求中发送了
field1
,但表单中有名为feild
的字段。打字错误?是的,对不起,这是问题的类型。真正的应用程序字段名是不同的。几天前我实现了这一点。不完全是通过REST
而是通过AngularJS
——我仍然没有使用Twig的form.*
函数打印我的表单。我试着找出原因,看看我在那里做了什么。写得好的问题……我也有同样的问题。你最后是如何解决这个问题的?我正在使用{'form_name':{'field1'=>'value1'}
if ('' === $name) {
$params = $request->request->all();
$files = $request->files->all();
} elseif ($request->request->has($name) || $request->files->has($name)) {
$default = $form->getConfig()->getCompound() ? array() : null;
$params = $request->request->get($name, $default);
$files = $request->files->get($name, $default);
} else {
// Don't submit the form if it is not present in the request
return;
}
$form->submit(array('field1' => $request->request->get('field1'), 'field2' => $request->request->get('field2')))