我正在构建一个多数据库应用程序,该应用程序需要根据已登录的用户选择数据库。
因此,将有一个用于设置和 FOS 用户包配置的共享表,但其余表将根据用户已添加到的组在不同的数据库中分配。
我已经设法找到了如何根据子域使用不同连接的教程,但这不适用于我的情况。
如何存档?
首先,您必须定义连接,如下所述:如何使用多个实体管理器和连接。
然后,您可以创建一个服务,根据用户组返回相应的实体管理器。
服务定义:
app.user_database_helper:
class: AppBundleUserDatabaseHelper
arguments:
- "@security.token_storage"
- "@doctrine"
服务类:
namespace AppBundle;
use DoctrineBundleDoctrineBundleRegistry;
use SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorage;
class UserDatabaseHelper
{
private $tokenStorage;
private $doctrine;
public function __construct(TokenStorage $tokenStorage, Registry $doctrine)
{
$this->tokenStorage = $tokenStorage;
$this->doctrine = $doctrine;
}
public function getManager()
{
$token = $this->tokenStorage->getToken();
if (!$token) {
// return an entity manager for unauthenticated users
return $this->doctrine->getManager('unauthenticated');
}
$user = $token->getUser();
// set the manager name based on the user data
$managerName = ...;
return $this->doctrine->getManager($managerName);
}
}
在控制器中,您可以使用以下命令获取实体管理器:
$manager = $this->get('app.user_database_helper')->getManager();