Как я могу сослаться на различные среды внутри ProjectConfiguration.class.php Symfony - PullRequest
1 голос
/ 02 марта 2010

У меня есть среда разработки и разработки на одной машине. Я хотел бы настроить другой порт memcached в ProjectConfiguration.class.php в зависимости от моей среды. Я полагаю, что небезопасно использовать $ SERVER ['HTTP_HOST'] внутри файла ProjectConfiguration, поскольку это не учитывает задачи, запускаемые из командной строки.

Каков наилучший способ выполнить то, для чего предназначен этот бит кода:

public function configureDoctrine(Doctrine_Manager $manager) {

    if ($_SERVER['HTTP_HOST'] == 'dev.example.com') {
      $memcached_port = 11211;
    } else {
      $memcached_port = 11212;
    }

    $servers = array(
        'host' => '127.0.0.1',
        'port' => $memcached_port,
        'persistent' => true);
}

Ответы [ 2 ]

2 голосов
/ 21 июня 2012

Есть 2 способа сделать это.

Для начала вы должны настроить свою среду отдельно в index.php. Обычно мы устанавливаем prod, затем регистрируем файл и вручную меняем его на dev на наших серверах dev и локальных машинах, чтобы упростить развертывание. Я также рекомендую поместить этот файл в .gitignore, чтобы он никогда не был случайно изменен.

  1. Используйте файл конфигурации app.yml. В вашей конфигурации app.yml установите ключ с именем 'memcache_port' и установите значение отдельно для каждой среды. Файл yaml будет выглядеть примерно так:

    prod:
      memcached_port: 11211
    
    dev:
      memcached_port: 11212
    

    Затем, чтобы получить доступ к этому значению в коде, вы сказали бы:

    $memcached_port = sfConfig::get('app_memcached_port');
    
  2. Получить имя среды вручную через контекст Symfony

    $env = sfContext::getInstance()->getConfiguration()->getEnvironment();
    if($env == 'dev') {
      $memcached_port = 11211;
    } else if($env == 'prod') {
      $memcached_port = 11212;
    }
    

Я лично предпочитаю вариант 1, но вам решать, как вы решите эту проблему.

Примечание. Когда я ссылаюсь на среду, я имею в виду среду symfony, определенную в файле index.php.

Надеюсь, это поможет.

1 голос
/ 03 марта 2010

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

<?php

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

$env = ProjectConfiguration::getEnvironment();
if (!in_array($env, array('dev'))) throw new Exception('Not Allowed');

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', $env, true);
sfContext::createInstance($configuration)->dispatch();

Это из frontend_dev.php - поэтому он также гарантирует, что вы не можете получить доступ к контроллеру dev где-либо, кроме dev.

Мой класс конфигурации проекта содержит указанный метод, который выполняет работу:

public function getEnvironment() {
  if ($_SERVER ['HTTP_HOST'] == 'dev.example.com') {
    return 'dev';
  } else {
    return 'prod';
  }
}

Как вы правильно сказали, есть и задачи командной строки, которые нужно учитывать - но почти все задачи Symfony будут принимать аргументы --env = xxx. Я использую их. В любом случае все они по умолчанию используют dev, и именно здесь я делаю большую часть своей работы, так что это не так сложно, как кажется.

Я бы тогда использовал if (sfConfig::get('sf_environment') == 'dev') в вашем операторе if, а не HTTP_HOST напрямую, который будет работать как из строки cmd, так и из сети.

...