2016-02-23 4 views
3

У меня есть два объекта. Объект A является родителем Entity B. Я создаю REST для сущности A, которая содержит объект B в качестве дочерних элементов.Symfony2 Child Form Events Размножение

class EntityA { 
    private $name; 
    private $type; 

    private $bs; 
} 

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

Я в принципе сделать пост/ставить что-то вроде:

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

Для важной части, форма Entity А выглядит примерно так:

/** 
* @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 
} 

И мой Entity Форма 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

Как насчет присоединения слушателя к событию 'POST_SUBMIT ', но не ко всей области, а к полю bs в форме Entity A? –

+0

@ PawełMikołajczuk Это может сработать, но я искал более общее решение .. потому что представьте, что форма bs имеет дочерние формы сама .. или что форма bs используется во многих местах. Я пытаюсь избежать повторения. также мне пришлось бы определять функции в EntityAType, поэтому, если в другой форме используется «bs», мне пришлось бы повторять функции –

+0

. Я получаю вашу точку зрения, но не могу найти нигде информацию, если событие «Отправить» заполнено для встроенных форм; Похоже, это не так, но я не уверен на 100%. –

ответ

2

Я имел такой же вопрос, как вы были, и с небольшим количеством тестов я нашел ответ, поэтому я отвечать здесь, в случае, если кто-то еще находит свой путь здесь: Там IS распространение событий для событий Child form.

Точный жизненный цикл:

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

О вашей проблеме, я думаю, что это вызвано тем, не использовать непосредственно форму EntityB в форме EntityA, но CollectionType типа формы EntityB, в и кажется, что CollectionType естественно не отправляет события SUBMIT для каждого из своих детей.

Надеюсь, это поможет любому!

+1

Я принял этот ответ, потому что это очень логичное объяснение того, что происходит, и это имеет большой смысл. Это то, что я в конечном итоге принял и просто перешел к другому подходу. Спасибо! –