Мне нужно загрузить базу данных и конфигурацию сущности в Symfony2 из таблиц в базе данных во время выполнения.
По умолчанию конфигурация базы данных Symfony хранится в config.yml. Имена таблиц для сущности определены в аннотациях @ORM.
Но некоторые мои сущности могут храниться динамически в любой базе данных с любым именем таблицы, и заранее это не определено (кроме схемы таблицы), поэтому я не могу сохранить конфигурацию базы данных в конфигурации.
Я хочу установить конфигурацию базы данных по умолчанию в config.yml. Эта база данных будет хранить три таблицы:
Мне нужно динамически загружать эту конфигурацию в веб-запрос, прежде чем отправлять запросы сущностям, использующим EntityManager или EntityRepository. Другими словами, я хочу обработать эту конфигурацию, установить table_name и connection для каждой сущности перед обработкой веб-запроса в Controller. И тогда работа с сущностями прозрачна как обычно.
Как я понимаю, мне нужно реализовать что-то вроде Symfony ConfigLoader, но при обработке конфигурации соединение с базой данных отсутствует. Имя таблицы для сущности может быть установлено с использованием метаданных класса, но я не уверен, что это правильное решение.
Возможный способ — генерировать symfony config.yml для соединений и src / * Bundle / Resources / config / doctrine / *. Orm.yml для имен таблиц (вместо аннотаций @ORM) из базы данных каждый веб-запрос (или один раз при изменении конфигурации базы данных). в базе данных по умолчанию) очистите кэш базы данных Symfony и затем загрузите ядро Symfony. Но этот путь выглядит безобразно.
Кроме того, для фоновых задач может потребоваться работа с другими таблицами для объекта, а не с веб-запросами. Каждая сущность может иметь более одной таблицы, фоновая задача может генерировать новую таблицу, веб-запрос в это время использует предыдущую версию таблицы.
Может ли это быть реализовано с использованием стандартных гибких компонентов Symfony?
Я не думаю, что это жизнеспособная идея. Это приведет к высокой производительности, поскольку symfony кэширует файлы конфигурации для работы, и вы хотите создавать свою конфигурацию во время выполнения каждого запроса.
Если вы хотите сделать что-то подобное, создайте консольную команду, которая создаст ваши сопоставления и файлы конфигурации, и позвольте symfony очистить и заново создать свой кеш с php app/console clear:cache --env=prod
или что-то подобное.
Других решений пока нет …