从Symonfy中的数据库加载实体配置


Load entity configuration from database in Symonfy

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

  1. 包含数据库连接(database_connection_id, host, port, user, password, dbname)
  2. 包含关系(entity_name, table_name)
  3. 包含关系(table_name, database_connection_id)

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

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

一种可能的方法是生成symfony配置。src/*Bundle/Resources/config/doctrine/*.orm。每次web请求(或者当数据库配置在默认数据库中更改时),清除symfony数据库缓存,然后加载symfony内核。但是这条路看起来很丑。此外,后台任务可能需要与实体的其他表一起工作,而不是web请求。每个实体可以有多个表,后台任务可以生成一个新的表,此时web请求使用上一个版本的表。

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

我不认为这是个可行的主意。这将带来很大的性能成本,因为symfony为生产缓存配置文件,并且您希望在每个请求的运行时创建您的配置。

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