为什么Symfony将表单字段设置为null,如果它们不在模板中,而是在formType中



我无法理解为什么Symfony这样做。

假设我有 UserFormType 类

->add(username);
->add(datecreated);

现在我没有在我的模板中显示 dateCreated,然后 symfony 将DateCreated设置为 null 这会覆盖数据库值。

我想知道不将该值设置为 null 并且如果它不在模板中,则只有原始值有什么问题

来自文档: Additionally, if there are any fields on the form that aren't included in the submitted data, those fields will be explicitly set to null. 因此您必须渲染所有字段,否则它们将被设置为 null。

您不能将其添加到表单中,Symfony将在更新时保留该值,我猜您无论如何都会在代码中设置dateCreated,因此您不需要表单库尝试更新该字段。

另一种选择是将字段添加为隐藏字段->add('dateCreated', 'hidden')您需要在模板中渲染该字段,Symfony将保留日期创建数据。如果要渲染每一行,则可以在树枝中使用form_rest(form)来渲染所有缺少的字段。

这是一个古老的话题,但我遇到了同样的情况,对我来说,处理这个问题的最简单和最干净的方法是在你不想对它做任何事情时从表单中删除该字段。

例如,我想显示用户附加到的组列表,但其他用户看不到它们。结果是,对这些用户的任何更改都将删除他们已经拥有的组。

解决方案:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(
        FormEvents::PRE_SUBMIT,
        function (FormEvent $event) {
            $this->onPreSubmit($event);
        }
    );
    .....
}
public function onPreSubmit(FormEvent $event)
{
    $params = $event->getData();
    if (!isset($params['groups'])) {
        $event->getForm()->remove('groups');
    }
}

现在,如果设置了,您的表单将拒绝这些组,以避免您可以将选项添加到表单中 'allow_extra_fields' => true .它将通过验证,并且不执行任何操作。

虽然它很整洁,但我不是忠实的粉丝,但我看不到任何其他解决方案,否则您将不得不自己构建 html 和操作/服务来处理验证,而无需内置表单系统的 symfony。

相关内容

  • 没有找到相关文章

最新更新