Forms Symfony表单与AngularJS$资源不兼容

Forms Symfony表单与AngularJS$资源不兼容,forms,angularjs,rest,symfony,post,Forms,Angularjs,Rest,Symfony,Post,我有一个由RESTful Symfony应用程序支持的AngularJS应用程序。我在发布用户时遇到问题(例如,发布/api/users/123) 以下是Symfony表单在POST请求(编辑或提交资源)中所期望的内容: 您可以在这里看到,正在发布的对象被另一个用户:{…}对象(表示表单)包装起来 以下是Angular的$resource在调用用户时将发布的内容。$save(): 这里没有包装纸。该对象是直接发布的 哪一个是“正确的”,即RESTful 如何使Symfony或Angular与另

我有一个由RESTful Symfony应用程序支持的AngularJS应用程序。我在发布用户时遇到问题(例如,发布
/api/users/123

以下是Symfony表单在POST请求(编辑或提交资源)中所期望的内容:

您可以在这里看到,正在发布的对象被另一个
用户:{…}
对象(表示表单)包装起来

以下是Angular的$resource在调用
用户时将发布的内容。$save()

这里没有包装纸。该对象是直接发布的

  • 哪一个是“正确的”,即RESTful
  • 如何使Symfony或Angular与另一个一起工作(基于前面的答案)

以restful方式创建资源的有效POST请求没有id。根据定义,您可以设置id。如果目标存在,则会对其进行编辑,如果没有,则会创建它。关于第一个问题,第二种形式更“正确”

基本上是定义表单类型,因此完全由您决定(没有“它期望”)。例如:

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email')
        ;
    }

    public function getName()
    {
        return 'user_form';
    }
}
然后在控制器中传递一个空的用户实体

public function newAction()
{
    $user = ...;
    $form = $this->createForm(new UserType(), $user);

    // ...
}

有关更多信息,请参阅关于SF2表单。

以下是我如何解决它的,但如果它存在,我渴望一个更干净的解决方案

结果表明,表单类型的名称可以为空:

class UserType extends AbstractType
{
    // ..

    public function getName()
    {
        return '';
    }
}
这使得这是一个有效的提交:

{
  "email":"foo@mnapoli.fr"
}

据我所知,您可以只提交特定的表单数据,而不提交表单名称为键的整个数组,如

$form->submit($request->get($form->getName()));
// or $request->request (for POST)
// or $request->get (for GET)
// to be more specific
知道了这一点,你就应该能够使用

$form->submit($request->all());
// again with ->request or ->get to be more specific
。。将所有请求数据作为实际表单数据提交,而不需要表单名称作为键


这意味着任何额外字段(如果有的话)也会提交到表单中,并可能导致某些“此表单不应包含额外字段。”

您好,我想我们谈论的不是同一件事。这两种格式之间的区别不在于ID,而是Symfony希望对象被包装在表示表单的另一个对象中(即,
user:{…}
),而Angular将直接发布对象本身,而不包装它。我已经更新了我的问题。现在我知道你的意思了,你对通常在输入字段名称前加上的表单类型的名称有问题。是的,就是这样!我认为这是一个完全有效的解决办法。甚至@BernhardSchussek也推荐了它(尽管如此)。感谢@nietonfir的链接,它也确认了我在代码中读到的内容(它似乎是一个有效的用例)。我现在会接受这个答案(如果允许的话),如果有更好的替代方案出现,我会切换。我深入到代码中,找到了相同的解决方案,但我认为应该有更好的方法。你有更好的解决办法吗?@vishal nope,显然这就是它的本意…
$form->submit($request->get($form->getName()));
// or $request->request (for POST)
// or $request->get (for GET)
// to be more specific
$form->submit($request->all());
// again with ->request or ->get to be more specific