2010-03-02 6 views
1

J'ai un environnement de développement et de développement sur la même machine. Je voudrais configurer un port memcached différent dans ProjectConfiguration.class.php en fonction de mon environnement. J'imagine qu'il n'est pas sûr d'utiliser $ SERVER ['HTTP_HOST'] dans le fichier ProjectConfiguration car cela ne tient pas compte des tâches exécutées à partir de la ligne de commande.Comment faire référence à différents environnements dans ProjectConfiguration de Symfony.class.php

Quelle serait la meilleure façon d'accomplir ce que ce morceau de code se propose:

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

Répondre

1

J'utilise http hôte dans le contrôleur Web pour détecter l'environnement et le transmettre à l'instance de configuration du projet, par ici :

<?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(); 

Ceci est d'une frontend_dev.php - il assure également que vous ne pouvez pas accéder au contrôleur dev partout mais dev.

Ma classe de configuration de projet contient la méthode référencée, ce qui fait le travail:

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

Comme vous le dites à juste titre, il y a aussi la commande des tâches de ligne à considérer - mais presque toutes les tâches de symfony prendront --env = xxx arguments. Je les utilise. Ils sont tous par défaut dev, de toute façon, ce qui est l'endroit où je fais la plupart de mon travail, donc ce n'est pas aussi ardu que cela puisse paraître.

J'utiliserais alors if (sfConfig::get('sf_environment') == 'dev') dans votre instruction if, plutôt que le HTTP_HOST directement, qui fonctionnera à partir de la ligne cmd et du web.

+0

C'est une approche terrible. La valeur par défaut prod peut entraîner d'énormes problèmes si vous exécutez le script à partir de la ligne de commande. Je suggère d'ajouter une variable d'environnement serveur pour chaque serveur indiquant si prod ou dev. –

2

Il y a 2 façons d'accomplir ceci. Pour commencer, vous devez définir votre environnement séparément dans index.php. Ce que nous faisons habituellement est de le configurer en prod, puis d'archiver le fichier et de le changer manuellement en dev sur nos serveurs de développement et machines locales afin de faciliter le déploiement. Je recommande également de mettre ce fichier dans .gitignore afin qu'il ne soit jamais accidentellement changé.

  1. Utilisez le fichier de configuration app.yml. Dans votre configuration app.yml, configurez une clé appelée 'memcache_port' et définissez la valeur séparément pour chaque environnement. Le fichier YAML ressemblerait à quelque chose comme ceci:

    prod: 
        memcached_port: 11211 
    
    dev: 
        memcached_port: 11212 
    

    Ensuite, pour accéder à cette valeur dans le code que vous diriez:

    $memcached_port = sfConfig::get('app_memcached_port'); 
    
  2. obtenir le nom de l'environnement manuellement dans le contexte de symfony

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

Je préfère personnellement l'option 1, mais c'est à vous de décider comment vous voulez gérer ce.

Remarque: Lorsque je fais référence à l'environnement, je fais référence à l'environnement symfony défini dans le fichier index.php.

Espérons que cela aide.

Questions connexes