Symfony3形式:查看变换器错误建议使用视图变换器

时间:2017-08-21 20:04:18

标签: php symfony symfony-forms

我想创建一个简单的HiddenEntityType,以便我可以拥有代表实体的隐藏表单字段。到目前为止,最简单的解决方案是采用(视图)变压器。

但是我无法让它发挥作用。

基于文档here enter image description 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

0 个答案:

没有答案