symfony 2“;此表单不应包含额外字段。”;绑定REST请求数据时出现验证错误和问题

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->

我正在尝试使用Symfony表单来处理REST请求

我在symfony表单中绑定请求数据时遇到了问题。在浏览Symfony的代码时,我发现它使用了

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')))