【发布时间】:2016-05-18 10:04:27
【问题描述】:
短版
- 表单数据为:
['model' => new TestModel(123)] - 提交的表单包含以下数据:
[] - 我的期望:
['model' => null] - 我得到了什么:
['model' => $anEmptyInstanceOfTestModel]
加长版
我有一个简单的表格。此表单有一个用于我的自定义 FormType 的子表单(键“模型”)。
如果我使用“模型”已经存在的数据初始化表单,则模型不会为空,即使模型没有数据提交。另一方面,如果“model”的init数据为null,“model”的值保持为null。
问题
如果没有提交任何内容,如何配置我的表单以将“模型”设置为 null?
我已经尝试过设置'required' => false 和/或'empty_data' => null,但这似乎都没有帮助。
作为单元测试的简约示例
<?php
namespace AppBundle\Tests\Common\Form\Type;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Test\TypeTestCase;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class NullModelTest extends TypeTestCase {
public function testNullOnNotSubmitted() {
$tm = new TestModel(123);
$data = ['model' => $tm];
$form = $this->factory->createBuilder(FormType::class, $data)
->add('model', TestModelType::class, ['required' => false])
->getForm();
$form->submit([]); // submit no data
$this->assertTrue($form->isSynchronized());
$this->assertNull($form->getData()['model']); // ERROR: returns the empty model
}
}
class TestModel {
protected $id;
public function __construct($id = null) {
$this->id = $id;
}
public function getId() { return $this->id; }
public function setId($id) { $this->id = $id; }
}
class TestModelType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('id', TextType::class);
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefault('data_class', TestModel::class);
}
}
【问题讨论】:
标签: php symfony symfony-forms