Symfony表单 - 子条目内的访问实体键入CollectionType

Nic*_*ick 22 php symfony-forms symfony doctrine-orm

我正在尝试访问父CollectionType内部给定嵌入式表单的实体FormBuilder:

ParentType的

Class ParentType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('children', CollectionType::class, array(
            'entry_type' => ChildType::class
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

ChildType

class ChildType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $child = $builder->getData(); // this returns null
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Vendor\Bundle\Entity\Child',
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这是以正常形式工作,$child但返回为null.我怎样才能访问Child里面的实体ChildType

use*_*727 41

答案在于利用事件监听器该监听PRE_SET_DATA事件.

它将为您的闭包传递一个FormEvent类,该类包含表单和绑定到它的数据.

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(FormEvents::PRE_SET_DATA,
        function (FormEvent $event) use ($builder)
        {
            $form = $event->getForm();
            $child = $event->getData();

            if ($child instanceof Child) {

                // Do what ever you like with $child entity data

            }
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

  • 这在Symfony2.6中不起作用.没有DataEvent(您仍然可以google并查找包含该类详细信息的页面,但该类未包含在Symfony2中) (3认同)
  • 在symfony 2.6.事件类是`Symfony\Component\Form\FormEvent` (2认同)