要了解这里发生了什么,您必须首先了解数据映射。你打电话时
$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);