Symfony2 - 如何在 EventListeners 中使用数据转换器 [英] Symfony2 - How to use a Data Transformer inside 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屋!