2

我目前正在为我们公司开发一个 symfony 项目。而且我在弄清楚如何从环境变量构建动态配置时遇到问题。

我的主要问题是 symfony 将我的“defaut_database”缓存一次,然后再也不更改它。我愿意用我创建的每个 Vhost 中定义的变量来改变它。

这是我的虚拟主机配置:

<Macro demoVHost ${slug}>
<VirtualHost *:80>
   ServerName ${slug}.domain.com
   DocumentRoot /home/domain/www/web

   SetEnv SYMFONY__DYNAMIC__DATABASE_NAME db_${slug}

   <Directory /home/domain/www/web>
        AllowOverride None
        Order Allow,Deny
        Allow from All
        Require all granted

        <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app_demo.php [QSA,L]
        </IfModule>
   </Directory>

   ErrorLog /home/demo/log/${slug}.error.log
   CustomLog /home/demo/log/${slug}.access.log combined
</VirtualHost>
</Macro>

Use demoVHost aaa
Use demoVHost bbb
Use demoVHost ccc

还有我的 .yml 配置:

doctrine_mongodb:
   connections:
       default:
           server: 'mongodb://127.0.0.1:27017'
           options: {}
   default_database: "%dynamic.database_name%"
4

2 回答 2

0

我的主要目标是允许在单个环境中创建无限数量的演示平台,但每个平台都有一个专用数据库——而且是自动的,而不是手动的。

domain_AAA => app_demo.php/config_demo.php => db_AAA
domain_BBB => app_demo.php/config_demo.php => db_BBB
domain_CCC => app_demo.php/config_demo.php => db_CCC

因此,为了解决我的问题,我只是想在我的缓存目录中为我的“演示”环境创建一个额外的级别,并且效果很好。

在我的 AppKernel.php 文件中。

public function getCacheDir()
{
    if ($this->getEnvironment() === 'demo') {
        return dirname(__DIR__).'/var/cache/'.$this->getEnvironment() . '/' . $this->getEnvParameter('subdomain');
    }
    return dirname(__DIR__).'/var/cache/'.$this->getEnvironment();
}

public function getEnvParameter($name)
{
    $envParameters = $this->getEnvParameters();
    return array_key_exists($name, $envParameters) ? $envParameters[$name] : null;
}
于 2018-07-17T14:24:03.883 回答
0

您可以使用不同的环境来使用不同的数据库。因此,每个环境都会生成自己的容器缓存文件,并保留数据库连接设置。所有环境都可以为所有项目文件使用共享 APC 缓存,但使用自己的设置。

为了使它成为可能,你不需要任何.htaccess你只需要编辑你的app.php

$domainParts = explode('.', $_SERVER['SERVER_NAME']);
if (count($domainParts) === 3) { // If you have domains like aaa.domain.com, bbb.domain.com and so on
    $instance = $domainParts[0];
} else { // If user request "not right" domain like aaa.aaa.domain.com or domain.com
    $instance = 'prod';
}

$loader = new ApcClassLoader('your-apc-prefix-to-have-all-files-shared-across-all-instances', $loader);
$loader->register(true);


require_once __DIR__.'/../app/AppKernel.php';
//require_once __DIR__.'/../app/AppCache.php';

$kernel = new AppKernel($instance, false);

然后,您需要使用app/config/config_aaa.ymldomain aaa.domain.comapp/config/config_bbb.ymldomainbbb.domain.com等名称创建适当的配置文件。每个配置文件都包含数据库配置和主config.prod文件的导入:

imports:
    - { resource: config_prod.yml }

doctrine_mongodb:
   default_database: 'aaa' # or 'bbb', 'ccc' — for concrete domain

您可以放置​​的所有环境配置通用config_prod.yml

doctrine_mongodb:
   connections:
       default:
           server: 'mongodb://127.0.0.1:27017'
           options: {}
于 2018-07-17T07:23:49.980 回答