У меня есть приложение Symfony, которое использует одну и ту же кодовую базу для многих БД.
Это довольно типично, у меня есть отдельная база данных для каждого «экземпляра» (или «учетной записи») моего приложения, которое является простым инструментом медицинского назначения. Мне нужно сохранить эту архитектуру как есть.
Однако мы переходим с Symfony 2.8 на Symfony 4. До Symfony 4 мне приходилось создавать среду «псевдо-prod» Symfony для каждой БД, потому что Symfony (с Doctrine) очень привязан к наличию одной БД, указанной в конфигурации. и даже при использовании переменных env, таких как SYMFONY__DATABASE__NAME, свойства соединения с базой данных жестко запрограммированы в кеше, поэтому мне нужно было создать отдельную среду для каждого экземпляра приложения, следовательно, создать каталог для каждой учетной записи, что далеко от идеала.
Будут ли новые функции env vars из Symfony 4 делать динамическое соединение с БД более «родным» способом?
Должен ли я использовать другой метод для достижения этой цели? (например, создание собственной фабрики соединений и т. д.)
Я хотел бы иметь один кэш для моей среды prod и позволить параметрам соединения быть динамическими.
Любые идеи приветствуются. Спасибо!
Замечания:
Это НЕ дубликат: Использование отношений с несколькими менеджерами сущностей
Я уже использую несколько менеджеров сущностей, это не имеет к этому никакого отношения.
Настройка приложения для разных хостов с Symfony 4 должна быть простой. Вы можете просто предоставить DATABASE_URL
в качестве переменной среды для каждого хоста, например с помощью nginx:
server {
server_name domain.tld www.domain.tld;
root /var/www/project/public;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php7.1-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name";
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}
location ~ \.php$ {
return 404;
}
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
}
Бит импорта fastcgi_param DATABASE_URL ...
,
По умолчанию все экземпляры будут использовать один и тот же каталог кеша, что, вероятно, не то, что вам нужно. Представьте, что клиент А видит данные клиента Б, потому что он извлекается из кэша, а Б обращается к нему первым.
Способ обойти это изменить src/Kernel.php
включить в некоторую другую переменную env базовое имя проекта или другую информацию, идентифицирующую каждый хост, и добавить ее в базовый каталог кэша, определенный в getCacheDir
, По умолчанию это выглядит так:
public function getCacheDir(): string
{
return dirname(__DIR__).'/var/cache/'.$this->environment;
}
Вы также можете использовать встроенный компонент кэша Symfony, чтобы указать app.cache
с на хост вместо. Таким образом, вы можете повторно использовать системный кеш, отвечающий за кеширование контейнера, аннотаций, проверок и т. Д.
Вы можете найти конфигурацию кэша в вашем config/packages/framework.yml
под framework.cache
, Увидеть: https://speakerdeck.com/dbrumann/caching-in-symfony-an-overview?slide=37
Других решений пока нет …