我不明白为什么 Symfony 会这样做。
假设我有 UserFormType 类
->add(username);
->add(datecreated);
现在我不在我的模板中显示 dateCreated 然后 symfony 设置DateCreated
覆盖null
数据库值的。
我想知道不将该值设置为 null 的问题,如果它不在模板中,则只有原始值
我不明白为什么 Symfony 会这样做。
假设我有 UserFormType 类
->add(username);
->add(datecreated);
现在我不在我的模板中显示 dateCreated 然后 symfony 设置DateCreated
覆盖null
数据库值的。
我想知道不将该值设置为 null 的问题,如果它不在模板中,则只有原始值
这是一个老话题,但我遇到了同样的情况,对我来说处理这个问题的最简单和最干净的方法是当你不想对它做任何事情时从表单中删除该字段。
例如,我想显示用户所附加的组列表,但其他一些用户看不到它们。结果是这些用户的任何更改都会删除他们已经拥有的组。
解决方案:
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');
}
}
现在您的表单将拒绝已设置的组,以避免您可以在表单中添加 options 'allow_extra_fields' => true
。它将通过验证并且不做任何事情。
虽然它很整洁,但我不是一个忠实的粉丝,但我看不到任何其他解决方案,否则您将不得不自己构建 html 和操作/服务来处理验证,而无需 symfony 内置表单系统。
从文档中: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.
因此您必须呈现所有字段,否则它们将被设置为空。
您可以不将其添加到表单中,Symfony 将在更新时单独保留该值,我猜您无论如何都在代码中设置了 dateCreated,因此您不需要 Forms 库尝试更新该字段。
另一种选择是将字段添加为隐藏字段->add('dateCreated', 'hidden')
,您需要在模板中呈现该字段,Symfony 将保留 dateCreated 数据。如果要渲染每一行,您可以form_rest(form)
在树枝中使用来渲染所有缺失的字段。