Symfony, Доктрина, Конфигурация и Кэш Symfony

У меня есть приложение Symfony, которое использует одну и ту же кодовую базу для многих БД.

Это довольно типично, у меня есть отдельная база данных для каждого «экземпляра» (или «учетной записи») моего приложения, которое является простым инструментом медицинского назначения. Мне нужно сохранить эту архитектуру как есть.

Однако мы переходим с Symfony 2.8 на Symfony 4. До Symfony 4 мне приходилось создавать среду «псевдо-prod» Symfony для каждой БД, потому что Symfony (с Doctrine) очень привязан к наличию одной БД, указанной в конфигурации. и даже при использовании переменных env, таких как SYMFONY__DATABASE__NAME, свойства соединения с базой данных жестко запрограммированы в кеше, поэтому мне нужно было создать отдельную среду для каждого экземпляра приложения, следовательно, создать каталог для каждой учетной записи, что далеко от идеала.

Будут ли новые функции env vars из Symfony 4 делать динамическое соединение с БД более «родным» способом?

Должен ли я использовать другой метод для достижения этой цели? (например, создание собственной фабрики соединений и т. д.)

Я хотел бы иметь один кэш для моей среды prod и позволить параметрам соединения быть динамическими.

Любые идеи приветствуются. Спасибо!

Замечания:

Это НЕ дубликат: Использование отношений с несколькими менеджерами сущностей

Я уже использую несколько менеджеров сущностей, это не имеет к этому никакого отношения.

1

Решение

Настройка приложения для разных хостов с 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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]