Динамические параметры в зависимости от переменных среды (Vhost)

В настоящее время я работаю над проектом 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 ответа

Моя главная цель состояла в том, чтобы создать бесконечное количество демонстрационных платформ в одной среде, но с выделенной базой данных для каждой - и автоматически, а не вручную.

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;
}

Вы можете использовать разные среды для работы с разными базами данных. Таким образом, каждая среда будет генерировать собственный файл кэша контейнера с сохраненными настройками соединения с базой данных. Все среды могут использовать общий кэш 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.yml для домена bbb.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: {}
Другие вопросы по тегам