我想创建一个简单的HiddenEntityType
,以便我可以拥有代表实体的隐藏表单字段。到目前为止,最简单的解决方案是采用(视图)变压器。
但是我无法让它发挥作用。
基于文档here
...转发transform
需要返回可以放入HTML的字符串,一个字符串(例如我的实体的id),reverseTransform
必须将id转换为实体。
考虑到这一点,这是我制作的简单课程:
namespace AppBundle\Form\Type;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class HiddenEntityType extends AbstractType
{
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* Constructor
* @param EntityManagerInterface $entityManager
*/
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* @inheritDoc
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$repository = $this->entityManager->getRepository($builder->getDataClass());
$builder->addViewTransformer(new CallbackTransformer(
function ($entity) use($repository) { //Forward
dump('Forward');
dump($entity);
if (!is_null($entity)) return $entity->getId();
return $entity;
},
function ($id) use($repository) { //Reverse
dump('Reverse');
dump($id);
return $repository->find($id);
}
));
}
/**
* @inheritDoc
*/
public function getParent()
{
return 'hidden';
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
我收到以下不合逻辑的错误:
在渲染模板期间抛出异常(“表单的视图数据应该是AppBundle \ Entity \ MyEntity类的实例,但是是(n)整数。您可以通过设置“data_class”选项为null或添加视图转换器,将(n)整数转换为AppBundle \ Entity \ MyEntity的实例。“)。
创建表单时,根据您在上面看到的转储,前向转换将被调用两次 - 一次使用null
,一次使用AppBundle\Entity\MyEntity
作为参数。
我可能做错了什么?
Sy 3.3.6
PHP 7.1.8