【问题标题】:Load entity configuration from database in Symonfy在 Symfony 中从数据库加载实体配置
【发布时间】:2015-09-28 11:07:02
【问题描述】:

我需要在运行时从数据库中的表中加载 Symfony2 中的数据库和实体配置。 默认情况下,Symfony 数据库配置存储在 config.yml 中。实体的表名在 @ORM 注释中定义。 但是我的一些实体可以用任何表名动态存储在任何数据库中,并且事先没有定义(表模式除外),所以我不能在 config.xml 中存储数据库配置。 我想在 config.yml 中设置默认数据库配置。该数据库将存储三个表:

  1. 包含与数据库的连接(database_connection_id、主机、端口、用户、密码、数据库名称)
  2. 包含关系(实体名称、表名称)
  3. 包含关系(table_name、database_connection_id)

在使用 EntityManager 或 EntityRepository 向实体发出请求之前,我需要在 Web 请求中动态加载此配置。换句话说,我想处理这个配置,为每个实体设置 table_name 和连接,然后在 Controller 中处理 Web 请求。然后像往常一样使用透明的实体。

据我了解,我需要实现 Symfony ConfigLoader 之类的东西,但是在处理配置时没有数据库连接。可以使用 Class Metadata 设置实体的表名,但我不确定这是正确的决定。

一种可能的方法是为每个 Web 请求(或一次)从数据库中为连接和 src/*Bundle/Resources/config/doctrine/*.orm.yml 生成表名(而不是 @ORM 注释)生成 symfony config.yml默认数据库中更改数据库配置),清除 symfony 数据库缓存,然后加载 Symfony 内核。但是这种方式看起来很难看。 此外,后台任务可能希望使用实体的其他表而不是 Web 请求。每个实体可以有多个表,后台任务可以生成一个新表,此时web请求使用之前版本的表。

这可以使用标准的 symfony 灵活组件来实现吗?

【问题讨论】:

    标签: php database symfony config entitymanager


    【解决方案1】:

    我不认为这是一个可行的想法。由于 symfony 会缓存用于生产的配置文件,并且您希望在每个请求的运行时创建配置,因此这会带来巨大的性能成本。

    如果你想做类似的事情,创建一个控制台命令来创建你的映射和配置文件,然后让 symfony 清除并使用php app/console clear:cache --env=prod 或类似的东西重新创建它的缓存。

    【讨论】:

    • 它可以不在运行时。对于 Web 请求,我可以在每次需要更改实体的表名和连接时创建缓存。例如每 10 分钟一次。但是对于后台任务,一些性能泄漏不是问题。
    猜你喜欢
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2013-10-22
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多