使用symfony 2.7的REST json api,即使填充也不会验证

时间:2017-07-07 12:24:38

标签: php json symfony fosrestbundle

我试图弄清楚为什么在我使用预先填充的实体创建一个来自json请求的值时表单没有验证。

这是Symfony中已配置FosRestBundle的控制器:

public function createAction(Request $request)
{
    $house = new House();
    $house->setTitle($request->get('title'));
    $house->setDescription($request->get('description'));
    $house->setPostcode($request->get('postCode'));
    $house->setPhoneNumber((int) $request->get('phoneNumber'));
    $availability = $request->get('available') ? true : false;
    $house->setAvailability($availability);

    $form = $this->createCreateForm($house);

    $form->handleRequest($request);

    $response = new JsonResponse();

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($house);
        $em->flush();

        return $response->setData(array(
            'success' => true
        ));
    }

    return $response->setData(array(
        'success' => false,
        'errors' => $this->getFormErrors($form)
    ));
}

private function createCreateForm(House $entity)
{
    $form = $this->createForm(new HouseType(), $entity, array(
        'action' => $this->generateUrl('houses_create'),
        'method' => 'POST',
        'csrf_protection' => false
    ));

    return $form;
}

yaml配置文件:

# app/config/config.yml
fos_rest:
    param_fetcher_listener: true
    body_listener: true
    routing_loader:
        default_format: json
    exception:
        enabled: true
    # configure the view handler
    view:
        force_redirects:
            html: true
        formats:
            json: true
            xml: true
        templating_formats:
            html: true
    # add a content negotiation rule, enabling support for json/xml for the entire website
    format_listener:
        enabled: true
        rules:
            - { path: ^/, priorities: [ json, xml, html ], fallback_format: html, prefer_extension: false }

例如,如果我执行$form->get('title')->getData(),我可以看到表单已正确填充,但仍然没有通过验证,当我执行$this->getFormErrors($form)时,我只得到一个空数组。

关于如何调试此问题的任何想法?

2 个答案:

答案 0 :(得分:1)

为了接收json,您需要启用正文监听器功能。

config.yml

fos_rest:
    body_listener: true

您还应该check the documentation for advanced usage

答案 1 :(得分:0)

当你发起$ form时我注意到了一个拼写错误:" createCreateForm" - >它应该只是" createForm"。

如果这不起作用,请在" if($ form-> isValid()){"之后检查来自$ form-> getData()的值。部分。我怀疑框架不知道如何处理请求(不是来自标准表格)。在那种情况下,您可以手动设置实体上的值并保存它。

$house->setStuff($request->request->get('stuff');
...
$em->persist($house);`$em->flush();`