我有一个使用FormEvents::PRE_SET_DATA
Symfony 文档中描述的动态创建表单字段的表单类型:
https ://symfony.com/doc/current/form/dynamic_form_modification.html
这很好用!
我想ModelTransformer
在这个字段上有一个,因为我必须为基础实体转换表单输入。这在这里描述:
https ://symfony.com/doc/current/form/data_transformers.html
这也很好用 - 独立。但不能结合表格修改!
这是一个例子:
<?php
namespace App\Form;
use App\Entity\Product;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ProductType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name');
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$product = $event->getData();
$form = $event->getForm();
if (!$product || null === $product->getId()) {
$form->add('price');
}
});
$builder->get('price')
->addModelTransformer(new CallbackTransformer(
function ($value) {
// ToDo: Do transformation here
return $value;
},
function ($value) {
// ToDo: Do transformation here
return $value;
}
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Product::class
));
}
}
如果我创建并呈现此表单,我会得到:
The child with the name "price" does not exist.
在这一点上这听起来很合乎逻辑 - 但是有没有办法将ModelTransformer
与动态创建的字段结合起来?