要了解这里发生了什么,您必须首先了解数据映射。当你打电话时
$form->setData(array('photoname' => 'Foobar', 'size' => 500));
表单的数据映射器负责获取给定的数组(或对象)并将嵌套值写入表单的字段,即调用
$form->get('photoname')->setData('Foobar');
$form->get('size')->setData(500);
但在您的示例中,您处理的不是Form,而是FormBuilder 对象。 FormBuilder 负责收集表单的配置并使用此信息生成Form 实例。因此,FormBuilder 还允许您存储表单的默认数据。但由于它只是一个简单的配置对象,它不会调用数据映射器。例如:
$builder = $factory->createBuilder()
->add('photoname')
->add('size')
->setData(array('photoname' => 'Foobar', 'size' => 500));
print_r($builder->get('photoname')->getData());
print_r($builder->get('size')->getData());
这个例子会输出:
null
null
因为数据映射发生在稍后,当我们将FormBuilder 转换为Form 实例时。我们可以利用这一事实为各个字段设置单独的默认值:
$builder->add('size', null, array('data' => 100));
// which is equivalent to
$builder->get('size')
->setData(100)
->setDataLocked(true);
print_r($builder->get('photoname')->getData());
print_r($builder->get('size')->getData());
还有输出:
null
100
需要数据锁定以防止数据映射器覆盖您刚刚存储的默认数据。如果您传递“数据”选项,这将自动完成。
最后,您将构建表单。现在,FormBuilder 会在必要时调用 Form::setData(),而后者又会调用数据映射器:
$form = $builder->getForm();
// internally, the following methods are called:
// 1) because of the default data configured for the "size" field
$form->get('size')->setData(100);
// 2) because of the default data configured for the main form
$form->setData(array('photoname' => 'Foobar', 'size' => 500));
// 2a) as a result of data mapping
$form->get('photoname')->setData('Foobar');
// 2b) as a result of data mapping (but ignored, because the data was locked)
$form->get('size')->setData(500);