Symfony 使用formtype编辑对象

Symfony 使用formtype编辑对象,symfony,Symfony,我正在尝试使用formtype编辑我的一个对象。 创建新对象时,formtype工作正常,但当我尝试将现有实体加载到表单中时,出现以下异常: 必须管理传递到选择字段的类型为“代理\uuuuCG\uuuu\ App\Entity\Language”的实体。也许您忘了将其保存在实体管理器中 放入表单的对象是从数据库加载的,因此它已经100%持久化了 以下是类型: 单位类型 class UnitType extends AbstractType { public function buildF

我正在尝试使用formtype编辑我的一个对象。 创建新对象时,formtype工作正常,但当我尝试将现有实体加载到表单中时,出现以下异常:

必须管理传递到选择字段的类型为“代理\uuuuCG\uuuu\ App\Entity\Language”的实体。也许您忘了将其保存在实体管理器中

放入表单的对象是从数据库加载的,因此它已经100%持久化了

以下是类型:

单位类型

class UnitType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('unitTranslations', CollectionType::class, [
                'entry_type' => UnitTranslationType::class,
                'entry_options' => array('label' => false),
                'allow_add'    => true,
                'allow_delete' => true,
                'prototype'    => true,
                'by_reference' => false,
                'delete_empty' => true,
                'attr' => [
                    'class' => 'UnitTranslationSelector',
                ],
            ])
            ->add('save', SubmitType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Unit::class
        ));
    }
}
单位转换类型

class UnitTranslationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('name', TextType::class, [
                'label' => 'Unit',
                'by_reference' => false
            ])
            ->add('language', EntityType::class, [
                'class' => Language::class,
                'choice_label' => 'name',
                'placeholder' => 'Choose an option',
                'by_reference' => false
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => UnitTranslation::class,
        ));
    }
}
以及控制器:

public function createUnit(Request $request, EntityManagerInterface $entityManager)
    {
        $unit = new Unit();

        $unit = $entityManager->getRepository(Unit::class)->find(2);
        dump($unit);

        $form = $this->createForm(UnitType::class, $unit);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {

            foreach ($unit->getUnitTranslations() as $translation) {
                $translation->setUnit($unit);
            }

            $entityManager->persist($unit);
            $entityManager->flush();

            return $this->redirectToRoute("recipe_list");
        }
        return $this->render('createUnit.html.twig', array('form' => $form->createView()));

    }

我知道这个问题由来已久,但我只是通过使用CollectionType而不是EntityType(对于您案例中的语言实体)解决了同样的问题。我不确定您的实体是如何设置的,但是CollectionType需要UnitTranslation实体和Language实体之间的一对一或多对多关系。可以找到CollectionType的说明以及如何嵌入表单集合

这只是一个纯粹的猜测,但这个房产单位::unitTranslations是公共的吗?@Cerad nope,这个房产是私有的,太糟糕了。那么为什么在您的语言EntityType中有一个by_引用属性呢?老实说,我不知道为什么会有这个属性,但是by_引用是个问题,当我删除它时,它的默认值设置为true,加载工作没有任何问题,非常感谢!很高兴它起作用了。当帮助者和被帮助者都不理解其工作原理时,始终享受解决方案。