С symfony я пытаюсь прослушать заданное событие данных в форме, объявленной как услуга.
У меня есть родительская форма, в которой я вызываю -> add ('unit', 'fmu_unit')
EDIT: Я добавляю здесь полный простой пример. Он работает не так, как ожидалось.
Мой контроллер:
<?php namespace AppBundle\Controller; use AppBundle\Entity\MarketPlace\Product; use AppBundle\Form\UnitTestType; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; class DefaultController extends Controller { /** * @Route("/", name="home") * @Method({"POST", "GET"}) * @Template(":Default:index.html.twig") */ public function indexAction() { $formManager = $this->get('form_manager'); $product = new Product(); $unit = $this->getDoctrine()->getRepository('AppBundle:FoodAnalytics\Unit')->findOneByName('g'); $product->setUnit($unit); $form = $formManager->createForm(new UnitTestType(), $product ,'POST', 'home'); return array('form' => $form->createView()); } }
Мой первый тип (UnitTest):
<?php namespace AppBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class UnitTestType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('unit', 'fmu_unit') ; } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'AppBundle\Entity\MarketPlace\Product' )); } /** * @return string */ public function getName() { return 'unit_test'; } }
Мой второй тип (сервис, в котором я пытаюсь использовать Form Events):
<?php namespace AppBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class UnitType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) { $product = $event->getData(); $form = $event->getForm(); //This is not working $form->add('unit','entity', array( 'class' => 'AppBundle:FoodAnalytics\Unit' )); }); //This is working // $builder->add('unit','entity', array( // 'class' => 'AppBundle:FoodAnalytics\Unit' // )); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'inherit_data' => true, )); } /** * @return string */ public function getName() { return 'fmu_unit'; } }
Объявление как услуга:
services: unit.type: class: %unit.type.class% tags: - { name: form.type, alias: fmu_unit }
Вид: {{form (form)}} Ничего не отображается, кроме метки, когда я использую форму Events. Он отлично работает, если я его не использую.