Symfony2儿童形式事件传播

时间:2016-02-23 04:32:00

标签: php forms symfony entity event-listener

我有两个实体。实体A是实体B的父节点。我正在为实体A创建一个REST,它包含实体B作为子节点。

class EntityA {
   private $name;
   private $type;

   private $bs;
}

class EntityB {
   private $entityA;
   private $color;
}

我基本上做了一个帖子/放置类似的东西:

{ "name": "anamehere", "type": "atypehere", "bs": [{"color": "blue"}] }

对于重要的部分,实体A的形式看起来像这样:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', TextType::class)
        ->add('type', TextType::class)
        ->add('bs', CollectionType::class, array(
            'entry_type' => EntityB::class,
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false,
        ));

    $builder->addEventListener(FormEvents::SUBMIT, array($this, 'onSubmitData'));

}

public function onSubmitData(FormEvent $event) {
    // Do Something
}

我的实体B的形式类似于:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('color', TextType::class);

    $builder->addEventListener(FormEvents::SUBMIT, array($this, 'onSubmitData'));

}

public function onSubmitData(FormEvent $event) {
    // Do Something else
}

我遇到的问题是,当我执行POST / PUT时,实体B形式事件onSubmitData没有被调用。如何将事件从EntityA表单传播到EntityB表单。它在EntityAType中正常工作

1 个答案:

答案 0 :(得分:4)

我遇到了和你一样的问题,经过一些测试后我找到了答案,所以我在这里回答,以防有人在这里找到他的方式: IS 事件传播for Child form events。

确切的生命周期是:

Parent PRE_SUBMIT
                     Child PRE_SUBMIT
                                        GrandChild PRE_SUBMIT
                                        GrandChild SUBMIT
                                        GrandChild POST_SUBMIT
                     Child SUBMIT
                     Child POST_SUBMIT
Parent SUBMIT
Parent POST_SUBMIT  

关于你的问题,我的猜测是,它是由于你不直接在EntityA的表单中使用EntityB的表单,而是EntityB的表单类型的CollectionType,而且似乎CollectionType不会自然地为每个发送SUBMIT事件。为了它的孩子。

希望这对任何人都有帮助!