Symfony2 - 如何在 EventListeners 中使用数据转换器 [英] Symfony2 - How to use a Data Transformer inside EventListeners

查看:19
本文介绍了Symfony2 - 如何在 EventListeners 中使用数据转换器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  • 我需要使用事件侦听器,因为我需要在表单中显示不同的内容,无论它是新的还是已经存在的实体.我可以做到.

  • 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.

=> 但是,我无法同时执行 2(数据转换器 + 事件侦听器).我收到错误:错误:在非对象上调用成员函数 add()".如果我替换 $builder par $form,我会收到以下错误:尝试调用类Symfony\Component\Form\Form"的名为create"的未定义方法.

=> 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".

那行得通:

 $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
            //...
        }

这也有效:

$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
            //...
        }
    });

推荐答案

简短回答:您无法在侦听器中添加转换器,因为表单已被锁定.

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';
    }
}

将表单定义为服务:

 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')
    });

这篇关于Symfony2 - 如何在 EventListeners 中使用数据转换器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆