我有一个Symfony2软件包,我在这里使用基于子域的动态选择的EntityManagers以及用于一般设置的固定EM等。例如,用户登陆dev.mydomain.com
并显示一个登录屏幕,用于从包含站点标题,颜色等的default
数据库中提取信息。但是,登录脚本引用包含该子域的用户和数据的dev
数据库。同样,登录other.mydomain.com
时,登录会引用other
数据库。这一切都很有效,用户可以根据相应的数据库进行验证。
我遇到的问题是当我创建一个"新用户表单"使用Symfony的Form系统。我按照本书的概述,为用户角色使用了“多对多”关系,但无法找到指定使用哪个EntityManager的方法,从而使其查找与default
EntityManager的关系。
控制器/ UserController.php
public function addAction(Request $request) {
$us = new User();
// ORM Connection name stored in session from the login screen
$em = $this->getDoctrine()->getManager(
$request->getSession()->get('database')
);
$form = $this->createForm(
new UserType($em), $us
);
return $this->render(
'MyBundle:User:create.html.twig',
array( 'form' => $form->createView() )
);
}
实体/ user.php的
/**
* @var string
*
* @ORM\ManyToMany(targetEntity="Role", inversedBy="users", cascade={"persist"})
*/
private $roles;
config.yml
doctrine:
dbal:
connections:
default:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
dev:
driver: "%dev.database_driver%"
host: "%dev.database_host%"
port: "%dev.database_port%"
dbname: "%dev.database_name%"
user: "%dev.database_user%"
password: "%dev.database_password%"
charset: UTF8
orm:
default_entity_manager: default
auto_generate_proxy_classes: "%kernel.debug%"
entity_managers:
default:
connection: default
mappings:
MyBundle: ~
dev:
connection: dev
mappings:
MyBundle: ~
有没有办法将指定的EntityManager传递给createForm或FormBuilder以供内置的ManyToMany ORM注释使用?要清楚,表单的其余部分可以正常工作,添加用户到期望的EntityManager - 它只是仍在引用default
的角色字段。
答案 0 :(得分:0)
Form / UserType.php文件中使用的FormBuilder具有add()
方法,允许添加实体的组件。 add()
方法可以将一组选项作为第三个元素。其中一个选项是em
:
->add('roles', 'entity', array(
'class'=>'MyBundle:Role',
'property'=>'name',
'em'=>$options['em'],
'multiple'=>true
))
我能够通过Controller / User.php中的createForm()
方法将动态确定的实体管理器传递到文件中,以便从上面的选项数组中访问:
$form = $this->createForm(
new UserType($em), $us, array('em'=>$em)
);
最后,我确保通过在{/ 1}}中将其包含在Form / UserType.php中来确保实体经理:
setDefaultOptions()
在执行此操作时,表单中的ManyToMany Roles字段会从正确的实体管理器中拉出并保留。