2017-04-20 70 views
0

我有一个FormType没有实体,用于过滤集合的元素,其中一个表单字段是EntityType。当选择字段过滤并提交表单时,这些字段存储在会话数组中,当回到索引视图时,我使用会话存储字段创建查询。Symfony2异常:必须管理传递给选择字段的实体。也许坚持他们在实体经理?

问题是,当表单用实体字段中选择的元素进行submited时,symfony会抛出异常“传递给选择字段的实体必须被管理”。这适用于其他领域。

我经过主义代码和错误是在类IdReader抛出检查时如果对象是里面的ObjectManager:

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'。

这是我的FormType:

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() 
    ); 
} 

在此先感谢。

回答

0

我找到了解决办法。我更改了传递给会话的关于实体的数据,使用它的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; 

感谢所有。

0

如果您的实体中有构造函数,请尝试删除它。我有同样的问题,并解决了它。

另见:Response for the same question

+0

谢谢@ houssem-balty。我尝试删除表单中使用的实体的所有未使用字段,也是构造函数。我只是让ID,但没有工作。也尝试使用另一个实体并抛出相同的错误。 –

+0

你能编辑和添加你的实体吗? –