【问题标题】:Specify default entityManager in global request parameter with Symfony使用 Symfony 在全局请求参数中指定默认 entityManager
【发布时间】:2016-04-07 11:45:59
【问题描述】:

我有 2 个 entityManager 配置并正常工作(所有映射都正确加载等),使我能够使用 2 个数据库。

以与标准 Doctrine Command 任务允许 --em 或 --connection 参数类似的方式,我想有效地指定 EntityManager 并因此指定所使用的 DB。

我已经完成了在命令中切换容器引用的明显而骇人听闻的事情:

if ($input->getOption('background')) {
  $this->container->set('doctrine.orm.entity_manager', $this->container->get('doctrine.orm.background_entity_manager'));
}

这适用于前 x 个数据库查询(是一个长时间运行的命令),但是当 Doctrine 执行重新连接时,似乎使用了默认 EntityManager 并且另一个数据库连接到:

2016-04-07T11:27:47.792427Z  783 Connect    root@10.20.1.1 on partridge_background using TCP/IP
2016-04-07T11:27:47.802813Z  783 Query  SELECT t0.id AS id_1, t0.name AS name_2, t0.last_completion AS last_completion_3, t0.last_run AS last_run_4, t0.bookie_id AS bookie_id_5 FROM feeds t0 WHERE t0.name = 'CORAL_OPENBET' LIMIT 1
2016-04-07T11:27:47.823585Z  783 Query  SELECT c0_.id AS id_0, c0_.name AS name_1, c0_.canonicalised_name AS canonicalised_name_2, c0_.matchable_name AS matchable_name_3, c0_.display_order AS display_order_4, c0_.filtered AS filtered_5, c0_.name_alias AS name_alias_6, c0_.created_at AS created_at_7, c0_.updated_at AS updated_at_8, m1_.id AS id_9, m1_.domain_id AS domain_id_10, m1_.feed_id AS feed_id_11, m1_.feed_element_id AS feed_element_id_12, m1_.feed_request_url AS feed_request_url_13, m1_.feed_last_updated AS feed_last_updated_14, c0_.category2_id AS category2_id_15, m1_.domain_id AS domain_id_16 FROM category3 c2_, category3 c0_ INNER JOIN metacategory3 m1_ ON c0_.id = m1_.domain_id WHERE c0_.filtered = 0
2016-04-07T11:27:49.057129Z  784 Connect    root@10.20.1.1 on partridge using TCP/IP
2016-04-07T11:27:49.060680Z  784 Query  SELECT t0.id AS id_1, t0.name AS name_2, t0.canonicalised_name AS canonicalised_name_3, t0.matchable_name AS matchable_name_4, t0.display_order AS display_order_5, t0.filtered AS filtered_6, t0.name_alias AS name_alias_7, t0.created_at AS created_at_8, t0.updated_at AS updated_at_9, t0.category2_id AS category2_id_10 FROM category3 t0 WHERE t0.id = 48
2016-04-07T11:27:49.065852Z  784 Query  SELECT t0.id AS id_1, t0.domain_id AS domain_id_2, t0.feed_id AS feed_id_3, t0.feed_element_id AS feed_element_id_4, t0.feed_request_url AS feed_request_url_5, t0.feed_last_updated AS feed_last_updated_6, t0.domain_id AS domain_id_7 FROM metacategory3 t0 WHERE t0.domain_id = 48

在框架生命周期中相对较晚地进行这种 EntityManager 切换显然是错误的方法。我想要的是某种 Symfony 引导事件监听器,它可以根据请求更改默认的 EntityManager(在这种情况下和 ArgvInput 参数,但如果可以监听任何类型的请求的参数会很好)。

我正在考虑在运行时进行某种动态配置操作?

【问题讨论】:

  • This works for the first x number of db queries (is a long-running command) but when the Doctrine performs a reconnect - 重新考虑是否真的有必要在长时间运行的命令中使用 Doctrine。 PHP 不是为做这些事情而设计的,而且——迟早——你会遇到内存泄漏。有关您的应用程序逻辑的更多信息将很有帮助。尤其是你如何冲洗你的 UoW?
  • 这个命令在默认的 EM 下运行良好,尽管 ORM 的开销也足够好。按照文档中的建议,间歇性地进行刷新
  • 如何获取实体管理器实例?发布一些相关代码会有所帮助。
  • 我在移动 ATM 上。所有电话都是通过 Doctrine manager 进行的,即$container->get('Doctrine.ORM.entity_manager')->getRepositoryXXXX
  • 这将检索默认的 EM obv,但不能在 EM 检索的所有点添加开关

标签: symfony doctrine


【解决方案1】:

稍加思考和研究 (https://github.com/symfony/symfony/issues/1437) 让我得出结论,由于容器具有“已编译”性质,因此无法更改容器在运行时可以合理返回的服务。似乎解决方案是使用自己的配置创建一个新环境,并在调用我的命令时使用 --env 开关。

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多