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

Другие вопросы по тегам