Php 如何动态选择EntityManager与Symfony2表单上的多个主机一起使用
我有一个Symfony2捆绑包,其中除了用于常规设置等的固定EM之外,我还基于子域使用EntityManager的动态选择。例如,用户登陆dev.mydomain.com并显示一个登录屏幕,该屏幕从包含站点标题、颜色等的默认数据库中提取信息。登录脚本,但是,将引用包含该子域的用户和数据的dev数据库。类似地,当登录到other.mydomain.com时,登录会引用其他数据库。这一切都非常有效,用户可以根据相应的数据库进行验证 我遇到的问题是当我使用Symfony的表单系统创建一个新的用户表单时。我使用书中概述的用户角色的多对多关系,但找不到指定使用哪个EntityManager的方法,导致它根据默认EntityManager查找关系 Controller/UserController.phpPhp 如何动态选择EntityManager与Symfony2表单上的多个主机一起使用,php,symfony,orm,doctrine,Php,Symfony,Orm,Doctrine,我有一个Symfony2捆绑包,其中除了用于常规设置等的固定EM之外,我还基于子域使用EntityManager的动态选择。例如,用户登陆dev.mydomain.com并显示一个登录屏幕,该屏幕从包含站点标题、颜色等的默认数据库中提取信息。登录脚本,但是,将引用包含该子域的用户和数据的dev数据库。类似地,当登录到other.mydomain.com时,登录会引用其他数据库。这一切都非常有效,用户可以根据相应的数据库进行验证 我遇到的问题是当我使用Symfony的表单系统创建一个新的用户表单时
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() )
);
}
Entity/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中,以供内置的多个ORM注释使用?需要明确的是,表单的其余部分可以正常工作,将用户添加到所需的EntityManager中-只是角色字段仍然引用默认值。表单/UserType.php文件中使用的FormBuilder具有add方法,允许添加实体的组件。add方法可以将选项数组作为第三个元素。其中一个选项是em: 我能够通过Controller/User.php中的createForm方法将动态确定的实体管理器传递到文件中,以便从上述选项数组访问:
$form = $this->createForm(
new UserType($em), $us, array('em'=>$em)
);
最后,通过将实体管理器包含在表单/UserType.php中的setDefaultOptions中,我确保了实体管理器是必需的:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setRequired(array('em'));
$resolver->setDefaults(array(
'em' => null
));
}
在执行此操作时,“我的表单”中的“许多角色”字段将从正确的实体管理器中提取并保存到正确的实体管理器。请添加您定义实体管理器的配置文件,好吗?你为什么不选择2个或更多的包而不是1个呢?我已经把它包括在问题的底部。我选择使用单个bundle,因为它是一个跨多个机构使用相同代码库的应用程序。我想要一个简单的方法来启动一个新机构,只需将它们包含在配置和默认数据库站点表中,其中包括子域、徽标等,同时维护基于机构的对其不同数据库的权限。目前,您有两个实体经理管理同一件事。因此,如果运行应用程序/控制台原则:模式:验证两个模式都不同步,因为据我所知,一些实体由一个实体管理器管理,仅映射到一个数据库中,而其他实体则由另一个实体管理器管理,映射到另一个数据库中。在配置中写下区别,我认为应该可以。请看:@anegrea感谢您的回复。运行该语句会产生以下结果,这意味着模式中的一切都很好。我还更新了这个问题,使其包含区别,它们从另一个文件中提取参数。多个实体在整个站点上工作,只是不适用于表单上的这个字段。php应用程序/控制台原则:schema:validate[Mapping]OK-映射文件是正确的。[数据库]确定-数据库架构与映射文件同步。
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setRequired(array('em'));
$resolver->setDefaults(array(
'em' => null
));
}