动态参数取决于环境变量(Vhost)

时间:2018-07-16 14:17:59

标签: symfony caching symfony3.x dynamicparameters

我目前正在为我们公司从事symfony项目。而且我在解决如何从环境变量构建动态配置方面遇到问题。

我的主要问题是symfony一次缓存了我的“ defaut_database”,然后再对其进行更改。我愿意使用在我创建的每个Vhost中定义的变量对此进行更改。

这是我的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%"

2 个答案:

答案 0 :(得分: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.yml创建名称为aaa.domain.com,域app/config/config_bbb.ymlbbb.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: {}

答案 1 :(得分: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;
}