FOSRestBundle 形式
FOSRestBundle forms
我正在尝试构建 symfony2 rest api,但我正在为 FOSRestBundle 而苦苦挣扎
起初我可以使用“@View()”注释,因为它总是会说我的模板丢失了,无论我使用什么配置选项我都会得到同样的错误,然后在我的路由 yml 中我添加 "defaults: { _format: json }" 并突然显示正在运行。
v1:
resource: "@AppBundle/Controller/"
defaults: { _format: json }
type: annotation
prefix: /v1
但现在我遇到了表单问题 我创建了一个表单 class 和一个服务并设置了简单的控制器方法:
/**
* Creates a new Order entity.
*
* @Rest\Post("/products", name="products_create")
* @Rest\View()
* @param Request $request
* @return Product|array
*/
public function createAction(Request $request)
{
$product = new Product();
$form = $this->createForm('product', $product);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($product);
$em->flush();
return $product;
}
return $form;
}
现在,如果我的测试用例中的表单无效,我希望得到类似的响应,这在文档中显示:http://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#forms-and-views
但不是这样的:
{
"code": 400,
"message": "Validation Failed";
"errors": {
"children": {
"code": {
"errors": [
"This value should not be blank."
]
},
"name": {
"errors": [
"This value should not be blank."
]
},
"description": {
"errors": [
"This value should not be blank."
]
}
}
}
}
我得到:
{
"children": {
"code": [],
"name": [],
"description": []
}
}
这里发生了什么?我的设置有问题还是我遗漏了什么?顺便说一句,我在我的实体中设置了表单验证
{
"children": {
"code": [],
"name": [],
"description": []
}
}
这意味着表单是有效的并且没有任何验证错误。所以,这是正确的回答,因为你说你的测试用例有有效的形式。
如果在表单声明中将字段定义为 "required" 并且具有验证约束 NotBlank ( http://symfony.com/doc/current/reference/constraints/NotBlank.html ),则下面的响应片段将显示。
"errors": [
"This value should not be blank."
]
编辑:
在评论中讨论后:将 "handleRequest" 替换为 "submit" 有所帮助。
我知道这已被标记为已解决,但我最近遇到了与 FOSRestBundle 相同的问题,未按照
中记录的方式返回无效表单
http://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#forms-and-views
我发现实际问题与使用 JMS 序列化器时 在 AppKernel 中注册包的顺序有关。您必须确保按以下顺序加载:
new JMS\SerializerBundle\JMSSerializerBundle(),
new FOS\RestBundle\FOSRestBundle()
完成后,当表单验证失败时,我开始看到与文档一致的结果。
我正在尝试构建 symfony2 rest api,但我正在为 FOSRestBundle 而苦苦挣扎
起初我可以使用“@View()”注释,因为它总是会说我的模板丢失了,无论我使用什么配置选项我都会得到同样的错误,然后在我的路由 yml 中我添加 "defaults: { _format: json }" 并突然显示正在运行。
v1:
resource: "@AppBundle/Controller/"
defaults: { _format: json }
type: annotation
prefix: /v1
但现在我遇到了表单问题 我创建了一个表单 class 和一个服务并设置了简单的控制器方法:
/**
* Creates a new Order entity.
*
* @Rest\Post("/products", name="products_create")
* @Rest\View()
* @param Request $request
* @return Product|array
*/
public function createAction(Request $request)
{
$product = new Product();
$form = $this->createForm('product', $product);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($product);
$em->flush();
return $product;
}
return $form;
}
现在,如果我的测试用例中的表单无效,我希望得到类似的响应,这在文档中显示:http://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#forms-and-views
但不是这样的:
{
"code": 400,
"message": "Validation Failed";
"errors": {
"children": {
"code": {
"errors": [
"This value should not be blank."
]
},
"name": {
"errors": [
"This value should not be blank."
]
},
"description": {
"errors": [
"This value should not be blank."
]
}
}
}
}
我得到:
{
"children": {
"code": [],
"name": [],
"description": []
}
}
这里发生了什么?我的设置有问题还是我遗漏了什么?顺便说一句,我在我的实体中设置了表单验证
{
"children": {
"code": [],
"name": [],
"description": []
}
}
这意味着表单是有效的并且没有任何验证错误。所以,这是正确的回答,因为你说你的测试用例有有效的形式。
如果在表单声明中将字段定义为 "required" 并且具有验证约束 NotBlank ( http://symfony.com/doc/current/reference/constraints/NotBlank.html ),则下面的响应片段将显示。
"errors": [
"This value should not be blank."
]
编辑:
在评论中讨论后:将 "handleRequest" 替换为 "submit" 有所帮助。
我知道这已被标记为已解决,但我最近遇到了与 FOSRestBundle 相同的问题,未按照
中记录的方式返回无效表单http://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#forms-and-views
我发现实际问题与使用 JMS 序列化器时 在 AppKernel 中注册包的顺序有关。您必须确保按以下顺序加载:
new JMS\SerializerBundle\JMSSerializerBundle(),
new FOS\RestBundle\FOSRestBundle()
完成后,当表单验证失败时,我开始看到与文档一致的结果。