1

我有一个 Symfony 应用程序,它为许多数据库共享相同的代码库。

这很典型,我的应用程序的每个“实例”(或“帐户”)都有一个数据库,这是一个简单的医疗预约工具。我需要保持这种架构不变。

但是,我们正在从 Symfony 2.8 迁移到 Symfony 4。在 Symfony 4 之前,我必须为每个数据库创建一个“伪产品”Symfony 环境,因为 Symfony(使用 Doctrine)与配置指定的单个数据库非常相关,甚至使用像 SYMFONY__DATABASE__NAME 这样的环境变量,数据库连接属性被硬编码到缓存中,所以我需要为每个应用程序实例创建不同的环境,因此为每个帐户创建一个缓存目录,这远非理想。

Symfony 4 的新环境变量特性是否会使动态数据库连接以“原生”方式更可行?

我应该使用另一种方法来实现这一目标吗?(例如,创建自定义连接工厂等)

我想为我的产品环境提供一个缓存,并让连接参数是动态的。

任何想法表示赞赏。谢谢!

笔记:

这不是重复的:Using Relations with Multiple Entity Managers

我已经在使用多个实体管理器,这与此无关。

4

1 回答 1

2

使用 Symfony 4 为不同的主机设置你的应用程序应该是直截了当的。您可以只为DATABASE_URL每个主机提供 as 环境变量,例如使用 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 ....

默认情况下,所有实例都将使用相同的缓存目录,这可能不是您想要的。想象一下客户 A 看到客户 B 的数据,因为它是从缓存中提取的,而 B 首先访问了它。

解决此问题的一种方法是修改src/Kernel.php以考虑其他一些环境变量、项目的基本名称或标识每个主机的其他一些信息,并将其附加到定义的缓存基目录中getCacheDir。默认情况下,它看起来像这样:

public function getCacheDir(): string
{
    return dirname(__DIR__).'/var/cache/'.$this->environment;
}

你也可以使用 Symfony 的内置缓存组件来为app.cache每个主机指定不同的 s。通过这种方式,您可以重用负责缓存容器、注释、验证等的系统缓存。

你可以在你的config/packages/framework.yml下找到缓存配置framework.cache。请参阅:https ://speakerdeck.com/dbrumann/caching-in-symfony-an-overview?slide=37

于 2018-02-05T07:22:14.740 回答