symfony 2.3表单getData在子表单集合中不起作用

Ang*_*gel 9 forms collections builder symfony

我有一个包含集合的表单.所以我有:

/* my type */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('name')
    ->add('photos','collection',array(
        'type'=> new PhotoType(),
        'allow_add'=>true));
}

/*Photo Type*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('photoname')
    ->add('size')
}
Run Code Online (Sandbox Code Playgroud)

但我想访问照片中的数据,所以我尝试在PhotoType中:

$data = $builder->getData();
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用,即使我正在编辑表单,所以照片集合有数据.为什么我不能以另一个调用的形式访问$ builder-> getData()?因为我正在尝试不做和eventListener ......

Ber*_*sek 21

要了解这里发生的事情,您必须首先了解数据映射.你打电话的时候

$form->setData(array('photoname' => 'Foobar', 'size' => 500));
Run Code Online (Sandbox Code Playgroud)

表单的数据映射器负责获取给定的数组(或对象)并将嵌套的值写入表单的字段,即调用

$form->get('photoname')->setData('Foobar');
$form->get('size')->setData(500);
Run Code Online (Sandbox Code Playgroud)

但是在你的例子中,你没有处理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());
Run Code Online (Sandbox Code Playgroud)

这个例子将输出:

null
null
Run Code Online (Sandbox Code Playgroud)

因为我们将数据映射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());
Run Code Online (Sandbox Code Playgroud)

并输出:

null
100    
Run Code Online (Sandbox Code Playgroud)

需要数据锁定以防止数据映射器覆盖刚刚存储的默认数据.如果您传递"数据"选项,则会自动完成此操作.

最后,您将构建表单.现在,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);
Run Code Online (Sandbox Code Playgroud)

  • 如果有人可以解释为什么你可以在父formBuilder中访问$ builder-> getData(),但是在关联实体的sub formType中,你就不能这样做.我认为该子类型关联实体的变量对象至少应该是可访问的,如果不是整个表单数据的话.如何访问此子formType中的数据?似乎我读到的关于Symfony中每个主题的每个解决方案都是创建一个听众......即使是最简单的事情. (8认同)