【问题标题】:Replace the default entity manager with new one in Symfony用 Symfony 中的新实体管理器替换默认实体管理器
【发布时间】:2020-08-31 16:02:24
【问题描述】:

我有一个默认的实体管理器,它运行良好,可以管理我们拥有的所有实体。

但是现在,我想添加另一个基于相同连接设置的实体管理器,但数据库名称已更改(凭据、表等相同,但在另一个数据库中)。

默认连接的配置:

doctrine:
    dbal:
        default_connection: default_conn
        connections:
            default_conn:
                wrapper_class: Project\Dbal\Connection\ConnectionWrapper
                url: '%env(DEFAULT_DB_URL)%'

ConnectionWrapper:

class ConnectionWrapper extends Connection
{
    public function __construct(array $params, Driver $driver, ?Configuration $config = null,
                                ?EventManager $eventManager = null)
    {
        $params['dbname'] = DatabaseSingleton::getInstance();

        parent::__construct($params, $driver, $config, $eventManager);
    }

    public function switch(string $dbName): void
    {
        // close current connection if required
        if ($this->isConnected()) {
            $this->close();
        }

        // replace database url with new database name
        $params = $this->getParams();
        $url = substr($params['url'], 0, strlen($params['url']) - strlen($params['dbname'])) . $dbName;

        // replace connection's params
        $params['url'] = $url;
        $params['dbname'] = $dbName; // new_database_name
        DatabaseSingleton::setValue($dbName);

        // initialize again the connection with updated connection's parameters
        $this->__construct($params, $this->_driver, $this->_config, $this->_eventManager);
    }
}

控制器中携带改变数据库名称的代码(也就是说,调用这个控制器动作后连接(和em)应该改变):

/**
 * @Route("/e2e", methods={"PATCH"})
 */
public function switchDatabase(Request $request): void
{
   // switch connection's database name
   /** @var ConnectionWrapper $conn */
   $conn = $this->getDoctrine()->getConnection();
   $conn->switch('new_database_name', $logger);

   // creating new entity manager
   /** @var EntityManagerInterface $em */
   $em = $this->getDoctrine()->getManager();
   $this->getDoctrine()->resetManager();
   $newEm = EntityManager::create($conn, $em->getConfiguration(), $em->getEventManager());

   $user = new User('chris');
   $newEm->persist($user);
   $newEm->flush();

   // how to replace the current (old) entity manager with the new one?
   // how to retain this new for all other futures requests?
}

当我想检索我的用户时,问题出在其他控制器中。使用的是旧实体管理器(具有旧数据库名称)而不是我的新管理器..

public function test(EntityManagerInterface $em): JsonResponse
    {
        
        $entities = $em->getRepository(User::class)
                       ->findBy(['username' => 'chris']);

        return new JsonResponse($user); // no result.. !
    }

如何在所有 Symfony 应用程序上用新创建的实体管理器替换默认实体管理器(而不仅仅是在我的控制器内部使用 $newEm 变量)。

问题是我不能使用我的$newEm 在我的控制器中进行查询。但是我没有成功用这个新的管理器替换我的 Symfony 应用程序的默认实体管理器。

PS:我的单身班似乎不是工人......

【问题讨论】:

    标签: symfony doctrine-orm doctrine entitymanager


    【解决方案1】:

    与其尝试替换由 symfonys 依赖注入容器管理的实体管理器,不如采取不同的方法:

    Symfony/Doctrine 允许您配置第二个学说 dbal 连接以及第二个实体管理器。然后 Symfony 将管理这两个实体管理器,您可以决定在哪个服务中需要哪一个。

    请参阅此文档:https://symfony.com/doc/current/doctrine/multiple_entity_managers.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      相关资源
      最近更新 更多