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

完成后,当表单验证失败时,我开始看到与文档一致的结果。