Forms Symfony2异常:必须管理传递到选项字段的实体。也许可以将它们保存在实体管理器中?

Forms Symfony2异常:必须管理传递到选项字段的实体。也许可以将它们保存在实体管理器中?,forms,symfony,doctrine-orm,Forms,Symfony,Doctrine Orm,我有一个没有实体的FormType,用于过滤集合的元素,其中一个表单字段是EntityType。当选择字段进行筛选并提交表单时,这些字段存储在会话数组中,当返回到索引视图时,我使用会话存储的字段创建查询 问题是,当提交表单时,在Entity字段中选择了一个元素,symfony抛出异常“传递到choice字段的实体必须被管理”。这适用于其他字段 我浏览了条令代码,在检查对象是否在ObjectManager中时,在类IdReader中抛出错误: if (!$this->om->conta

我有一个没有实体的FormType,用于过滤集合的元素,其中一个表单字段是EntityType。当选择字段进行筛选并提交表单时,这些字段存储在会话数组中,当返回到索引视图时,我使用会话存储的字段创建查询

问题是,当提交表单时,在Entity字段中选择了一个元素,symfony抛出异常“传递到choice字段的实体必须被管理”。这适用于其他字段

我浏览了条令代码,在检查对象是否在ObjectManager中时,在类IdReader中抛出错误:

if (!$this->om->contains($object)) {
    throw new RuntimeException(
        'Entities passed to the choice field must be managed. Maybe '.
        'persist them in the entity manager?'
    );
}
我在寻找解决方案,但没有一个对我有效。我在其他项目中也有这种过滤器,效果很好。我认为这是一种不允许正确管理实体的配置问题,但我在条令配置中有“auto_mapping:true”

这是我的表单类型:

public function buildForm(FormBuilderInterface $builder, array $options) {

    $builder
        ->add('estat','choice', array(
            'required' => false,
            'choices' => Relacio::$arrayEstat,
            'multiple' => true,
            'placeholder' => '--',
            'label' => 'Estat'
        ))
        ->add('institucio', 'entity', [
            'label' => 'Institució',
            'class' => 'RelacioBundle:Institucio',
            'required' => false,
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('s')
                        ->addOrderBy('s.id', 'ASC');
            }
        ])
    ;
}
这是我的控制器应用过滤器的功能:

public function applyFilterAction(Request $request) {
    $filtre = [];
    $sessio = $this->get('session');

    $form = $this->createForm(
        new RelacioFiltreType(),
        $filtre,
        [
            'action' => $this->generateUrl('relacio_aplicar_filtre'),
            'method' => 'POST'
        ]
    );

    $form->handleRequest($request);

    if ($form->isValid()) {
        $dades = $form->getData();
        $sessio->set('relacio.filtre.institucio',$dades['institucio'] ? $dades['institucio'] : null);
        return $this->redirectToRoute('relacions',['request' => $request]);
    }

    return array(
        'form' => $form->createView()
    );
}

提前感谢。

如果实体中有构造函数,请尝试将其删除。我也有同样的问题,这就解决了


另请参见:

我找到了解决方案。我使用实体的id而不是整个实体来更改传递给会话的关于实体的数据

我按如下方式设置会话值:

$sessio->set('relacio.filtre.institucio',$dades['institucio'] ? $dades['institucio']->getId() : null);
$dades_filtre['institucio'] = $sessio->get('relacio.filtre.institucio') ? $em->getRepository('XalocSafErpBundle:SpTrbInstit')->find($sessio->get('relacio.filtre.institucio')) : null;
我得到的值如下:

$sessio->set('relacio.filtre.institucio',$dades['institucio'] ? $dades['institucio']->getId() : null);
$dades_filtre['institucio'] = $sessio->get('relacio.filtre.institucio') ? $em->getRepository('XalocSafErpBundle:SpTrbInstit')->find($sessio->get('relacio.filtre.institucio')) : null;

谢谢。

谢谢@houssem balty。我尝试删除表单中使用的实体的所有未使用字段,以及构造函数。我只是把身份证给你了,但没用。同时尝试使用另一个实体并抛出相同的错误。