Forms Symfony表单与AngularJS$资源不兼容
我有一个由RESTful 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与另
/api/users/123
)
以下是Symfony表单在POST请求(编辑或提交资源)中所期望的内容:
您可以在这里看到,正在发布的对象被另一个用户:{…}
对象(表示表单)包装起来
以下是Angular的$resource在调用用户时将发布的内容。$save()
:
这里没有包装纸。该对象是直接发布的
- 哪一个是“正确的”,即RESTful
- 如何使Symfony或Angular与另一个一起工作(基于前面的答案)
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