我有一个表单类型,它使用带有实体字段的查询构建器来获取相关选项。但是因为我正在为实体使用自定义实体管理器,所以它似乎无法识别这些选项。我得到错误:
Entities passed to the choice field must be managed. Maybe persist them in the entity manager?
控制器操作:
/**
* @Route("/edit/{keyword_rank_id}/", name="lg.keywordrank.campaign.edit")
* @Template
*/
public function editAction(Request $request, Company $company, $client_slug, $keyword_rank_id)
{
$em = $this->getDoctrine()->getManager($company->getEntityManagerName());
$client = $this->getEntityOrNotFound($em, 'LGClientBundle:Client', 'client_slug', $client_slug);
$kr = $this->getEntityOrNotFound($em, 'LGKeywordRankBundle:KeywordRank', 'keyword_rank_id', $keyword_rank_id);
$form = $this->createForm(new KeywordRankForm(), $kr, array('client'=>$client,'em'=>$em));
...
}
表格类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name','text',array(
'label'=>'Campaign Name'
))
->add('client_domain', 'entity', array(
'class' => 'LGClientBundle:ClientDomain',
'choices'=> $this->getClientDomains($options['em'], $options['client']),
'property' => 'domain',
'label' => 'Domain: '
));
}
private function getClientDomains($em, $client)
{
$domains = $em->getRepository('LGClientBundle:ClientDomain')->findBy(array('client'=>$client));
return $domains;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'LG\KeywordRankBundle\Entity\KeywordRank',
'client' => null,
'em' => null
));
}
public function getName()
{
return 'lg_project_keywordrank';
}
任何人都有类似的问题或知道如何解决这个问题很棒
答案 0 :(得分:8)
您可以指定添加字段时要使用的实体管理器:
->add('client_domain', 'entity', array(
'class' => 'LGClientBundle:ClientDomain',
'choices'=> $this->getClientDomains($options['em'], $options['client']),
'em' => $options['em'],
'property' => 'domain',
'label' => 'Domain: '
));
此选项采用实体管理器名称,而不是选项本身,因此您必须更改
$em = $this->getDoctrine()->getManager($company->getEntityManagerName());
到
$em = $company->getEntityManagerName();
点击此处的文档:http://symfony.com/doc/current/reference/forms/types/entity.html#em
答案 1 :(得分:0)
我在我的应用程序上遇到了同样的问题,实际上如果我传递实体管理器实例以使其有效。
在我的情况下,问题是在config.yml文件中,我想解决这个全局问题。
我有默认的实体经理," mymodule"但在FormType中使用了不同的实体管理器。 这是我的配置
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: mymodule
entity_managers:
mymodule:
auto_mapping: true
connection: mymodule
mappings:
AppBundle: ~
XBundle: ~
当我在配置文件中将default_entity_manager更改为默认值时:
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: default
entity_managers:
default:
connection: mymodule
mappings:
AppBundle: ~
XBundle: ~
我改变了我的控制器:
$em = $this->getDoctrine()->getManager('mymodule');
到:
$em = $this->getDoctrine()->getManager('default');
它没有将实体管理器传递给FormType,所以在我的情况下它是关于orm实体管理器配置。