使用FOSRestBundle时,无效的表单不会被标准化

时间:2016-10-23 13:19:00

标签: symfony normalization fosrestbundle

使用FOSRestBundle和JMSSerializerBundle我无法通过\FOS\RestBundle\Serializer\Normalizer\FormErrorHandler将我的无效表单包含在异常中,如here所述。

而不是包含JSON对象的HTTP响应,如上述URL中所述(例如,使用codemessageerrors键),我看到了序列化的JSON表示形式表单对象(我已注册JMSSerializerBundle)。 HTTP状态确实设置为400.响应的JSON:

{
  "children": {
    "title": {},
    "sourceAddress": {
      "errors": [
        "This value should not be blank."
      ]
    },
    "payload": {}
  }
}

相关配置和代码:

config.yml:

fos_rest:
    view:
        view_response_listener: 'force'
        formats:
            json: true
    format_listener:
        rules:
            - { path: ^/, fallback_format: json }
    exception:
        enabled: true

控制器操作:

public function postCampaignsAction(Request $request)
{
    $campaign = new Campaign();

    $form = $this->createForm(CampaignType::class, $campaign);
    $form->submit($request->request->all());

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

        return View::createRouteRedirect('get_campaign', [
            'campaign' => $campaign->getId(),
        ]);
    }

    return $form;
}

非常感谢任何帮助! :)

编辑:我已设法通过将其添加到parameters.yml来获得所需结果:

parameters:
        jms_serializer.form_error_handler.class: FOS\RestBundle\Serializer\Normalizer\FormErrorHandler

我不明白为什么这是必要的,因为FOSRestBundle/Resources/config/serializer.xml已经包含:

    <parameters>
        <!-- Override the default jms FormErrorHandler -->
        <parameter key="jms_serializer.form_error_handler.class">FOS\RestBundle\Serializer\Normalizer\FormErrorHandler</parameter>
    </parameters>

这可能是FOSRestBundle中的错误吗?

1 个答案:

答案 0 :(得分:1)

发现我做错了什么:我在FOSRestBundle之前将JMSSerializerBundle放在捆绑数组中进行注册。

JMSSerializerBundleFOSRestBundleapp/AppKernel.php注册的顺序很重要。如果FOSRestBundle在<{1}}中返回的数组中 JMSSerializerBundle之前为 ,则\AppKernel::registerBundles中的jms_serializer.form_error_handler.class的参数覆盖{1}} Resources/config/serializer.xml文件无效。