我有一个没有实体的FormType,用于过滤集合的元素,其中一个表单字段是EntityType . 当选择字段来过滤它并提交表单时,这些字段存储在会话数组中,当返回到索引视图时,我创建一个包含会话存储字段的查询 .
问题是当表单与实体字段中选择的元素一起提交时,symfony抛出异常“必须管理传递给选择字段的实体” . 这适用于其他字段 .
我查看了Doctrine代码,当检查对象是否在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?'
);
}
我寻找一个解决方案,但它们都不适合我 . 我在其他项目中有这些过滤器并且工作正常 . 我认为这是一种配置问题,不允许正确管理实体,但我在doctrine配置中有'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');
}
])
;
}
这是我的Controller函数来应用过滤器:
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()
);
}
提前致谢 .
2 回答
如果您的实体中有构造函数,请尝试删除它 . 我有同样的问题,解决了它 .
另见:Response for the same question
我找到了解决方案 . 我使用其id而不是整个实体更改传递给会话的有关实体的数据 .
我设置会话值如下:
我得到了这样的 Value :
谢谢你 .