我如何在Symfony的ProjectConfiguration.class.php中引用不同的环境

时间:2010-03-02 15:29:44

标签: php symfony1 doctrine memcached

我在同一台机器上有一个暂存和开发环境。我想根据我的环境在ProjectConfiguration.class.php中配置一个不同的memcached端口。我想在ProjectConfiguration文件中使用$ SERVER ['HTTP_HOST']并不安全,因为这不会考虑从命令行运行的任务。

完成这段代码的最佳方法是什么:

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 个答案:

答案 0 :(得分:2)

有两种方法可以实现这一目标。

首先,您应该在index.php中单独设置环境。我们通常做的是将其设置为prod,然后检入文件,并在我们的开发服务器和本地机器上手动将其更改为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;
    }
    
  3. 我个人更喜欢选项1,但完全由您决定如何处理。

    注意:当我引用环境时,我指的是index.php文件中定义的symfony环境。

    希望这有帮助。

答案 1 :(得分:1)

我在Web控制器中使用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之外的任何地方。

我的项目配置类包含引用的方法,它可以完成工作:

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

正如您所说,还有一些命令行任务需要考虑 - 但几乎所有symfony任务都将采用--env = xxx参数。我用那些。无论如何,它们都默认为dev,这是我完成大部分工作的地方,所以它不像听起来那么艰巨。

然后我会在你的if语句中使用if (sfConfig::get('sf_environment') == 'dev'),而不是直接使用HTTP_HOST,它将同时适用于cmd行和web。