繁体   English   中英

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

[英]How can I refer to different environment's inside Symfony's ProjectConfiguration.class.php

我在同一台计算机上有一个暂存和开发环境。 我想根据我的环境在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);
}

有两种方法可以实现此目的。

首先,您应该在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; } 

我个人更喜欢选项1,但是完全由您决定如何处理。

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

希望这可以帮助。

我在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之外的任何地方访问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上正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM