Symfony3 多数据库/站点启用环境


Symfony3 Multi database / sites-enabled environment

我正在构建一个多数据库应用程序,该应用程序需要根据已登录的用户选择数据库。

因此,将有一个用于设置和 FOS 用户包配置的共享表,但其余表将根据用户已添加到的组在不同的数据库中分配。

我已经设法找到了如何根据子域使用不同连接的教程,但这不适用于我的情况。

如何存档?

首先,您必须定义连接,如下所述:如何使用多个实体管理器和连接。

然后,您可以创建一个服务,根据用户组返回相应的实体管理器。

服务定义:

app.user_database_helper:
    class: AppBundle'UserDatabaseHelper
    arguments:
      - "@security.token_storage"
      - "@doctrine"

服务类:

namespace AppBundle;
use Doctrine'Bundle'DoctrineBundle'Registry;
use Symfony'Component'Security'Core'Authentication'Token'Storage'TokenStorage;
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();