doushou9028 2015-11-18 20:36
浏览 20
已采纳

Symfony2 - 如何在EventListeners中使用Data Transformer

  • I need to use an Event Listener since I need different things to be displayed in my form whether it is new or an already existing entity. I can manage that.

  • I need a Data Transformer, to display the entity as text, which is something I also can do.

=> However, I fail in doing the 2 (Data Transformer+Event Listener) at the same time. I get the error: "Error: Call to a member function add() on a non-object". If I replace $builder par $form, I get the following error: Attempted to call an undefined method named "create" of class "Symfony\Component\Form\Form".

That works:

 $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event){
        $element = $event->getData();
        $form = $event->getForm();
        if (!$element || null === $element->getId()) { //new entity
            $form->add(...);
        } else { //exist already
            //...
        }

That also works:

$builder->add( $builder->create('element', 'text')->addModelTransformer($transformer));

But I cannot make the 2 working at the same time.

    $transformer = new ElementObjToStringTransformer($this->em);
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event){
        $element = $event->getData();
        $form = $event->getForm();
        if (!$element || null === $element->getId()) { //new entity
            $builder->add( $builder->create('element', 'text')->addModelTransformer($transformer));
        } else { //exist already
            //...
        }
    });
  • 写回答

2条回答 默认 最新

  • dpql57753 2015-11-18 21:22
    关注

    Short answer: You can´t add the transformer inside the listener because the form is already locked.

    Long answer: There are some solutions. The most common, at least for me, is to a create a Custom form type where you add your transformer. Then you add your custom form how you would normally do in the event listener:

    class ElementCustomType extends AbstractType {
    
        private $em;
    
        public function __construct(EntityManager $entityManager)
        {
            $this->em = $entityManager;
        }
    
        public function buildForm(FormBuilderInterface $builder, array $options) {
    
            $builder
                ->addModelTransformer(new ElementObjToStringTransformer($this->em))
            ;
        }
    
        public function getParent() {
            return 'text';
        }
    
        public function getName() {
            return 'elementCustom';
        }
    }
    

    Define your form as a service:

     app.form.type.custom_element:
        class: AppBundle\Form\Type\ElementCustomType
        arguments: [@doctrine.orm.entity_manager]
        tags:
            - { name: form.type, alias: elementCustom }
    

    Use the form in the listener as your would normally do:

    $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event){
            $element = $event->getData();
            $form = $event->getForm();
            $form->add('element', 'elementCustom')
        });
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义