3

我正在使用 Symfony2、Doctrine 和 FOSRestBundle 构建一个 API。我想使用表单组件来验证创建或修改记录并遇到一些问题的 API 请求。我一直在使用它自己的验证组件,但想转而使用表单组件,因为它将所有验证逻辑移出控制器,更好地处理将请求数据绑定到我的实体并更好地聚合错误消息。

我遇到的问题与不需要的字段有关,无论是通过 POST 创建记录还是通过 PUT 更新记录。理想情况下,我希望它根本不需要通过 HTTP 提交非必填字段,但这会导致表单验证失败。例如,我正在使用的实体上的字段之一是名为 endTime 的 DateTime 字段,这不是必需的。如果 POST 或 PUT 请求中不存在名为 endTime 的参数,Symfony2 会将值 null 从请求绑定到字段。当它被转换为 DateTime 实例时,它被转换为当前日期时间,这根本不是我想要的。

如果 HTTP 请求中不存在值,有没有办法告诉 Symfony 不要将值绑定到实体?这应该仍然是安全的,因为基于实体类中的注释验证仍然会失败。我可以覆盖绑定方法,但这似乎需要做很多工作......

感谢您的任何想法。

4

3 回答 3

2

如何使用不需要的字段作为键创建一个数组,然后在该数组顶部合并您请求 POST 或 PUT 并将其绑定到表单。这样,表单的提示必填字段就在那里,并且如果提供了请求数据。

于 2012-09-22T13:17:02.963 回答
2

您可以创建一个表单 EventSubscriber,在preBind事件中,将未提交的字段替换为其默认值(即,被绑定对象的值),而不是 null。

这是我创建的 EvenSubscriber:https ://gist.github.com/3766678 。默认情况下,在我的实现中,只有非必填字段将具有默认值而不是 null ...

你和任何人都可以免费使用这个课程,只要你保留作者标签,​​确实;-)

于 2012-09-22T16:37:48.100 回答
2

您可以使用自定义表单类验证组的组合来实现此目的。

首先,创建表单 ( Your\Bundle\Form\CreateFormType),它扩展Symfony\Component\Form\AbstractType了使用适当元素构建表单buildForm

    $建造者
        ->添加('标题')
        ->add('firstNames');

然后,您可以为每个实体属性添加验证。应该一起验证的每个属性都需要共享相同的组。

例如

    你的\捆绑\实体\用户:
        特性:
            标题:
                - 非空白:
                    组:[注册]
                    留言:请提供您的职位
            名字:
                - 非空白:
                    组:[注册]
                    留言:请提供您的名字

您还将拥有另一个组(和自定义表单)update,其中将包含该请求中存在的属性。

在您的表单类中,您可以配置使用哪些验证组setDefaultOptions()

    $resolver->setDefaults(数组(
        // ...
        'validation_groups' => 数组('register'),
        // ...
    ));

于 2012-11-19T12:29:52.623 回答