2011-11-02 3 views
1

Je suis nouveau dans le développement de shell dans Cake. Le problème auquel je suis confronté consiste à définir datasource dans le script lui-même. Mon fichier database.php est;Paramètre d'environnement de script CakePHP Shell

function __construct() 
{ 
    if(getenv('ENVIRONMENT') == 'staging') { 
     $this->default = $this->staging; 
    } else { 
     $this->default = $this->production; 
    } 
} 

Je configure donc la base de données en fonction du paramètre d'environnement du serveur Web. Naturellement, php-cli ne peut pas accéder à cette variable. Ce que je finis par faire est de créer une tâche de shell cakephp.

class SelectEnvTask extends Shell { 

    public function execute() 
    { 
     App::Import('ConnectionManager', 'Model'); 
     $configs = ConnectionManager::enumConnectionObjects(); 

     if (!is_array($configs) || empty($configs)) { 
      $this->out('Error! No database configuration has been found.'); 
     } 

     $connections = array_keys($configs); 

     if(!isset($this->args[0])) { 
      $this->out('Error! Please enter one of the environment settings as an argument: ' . implode('/', $connections) . 
       "\n\n" . 'eg. ./Console/cake *script_name* *environment*', 2); 
      exit(1); 
     } 

     if(!in_array($this->args[0], $connections)) { 
      $this->out($this->args[0] . ' environment could not be found!', 2); 
      exit(1); 
     } 

     //hacky solution until finding a better one 
     $models = App::objects('Model'); 
     foreach($models as $model) { 
      ClassRegistry::init($model)->setDataSource($this->args[0]); 
     } 
    } 
} 

Cela fonctionne correctement, mais comme vous le voyez dans le ci-dessous de la tâche, je reçois tous les noms de modèle et de changer leur connexion DB, ce qui est une bonne pratique. Je ne veux pas non plus mettre plus de variables dans la classe de base de données et aimerais les gérer dans les shells/tasks.

Existe-t-il un moyen plus élégant d'y parvenir?

Merci,

+0

Hey merinn, a fait vous obtenez une réponse à cela? J'ai le même doute à ce sujet. Comment mettre en œuvre une solution élégante basée sur un environnement de serveur pour les deux besoins, Web et la console. – Junior

Répondre

0

Voici une solution beaucoup plus élégante. Ajoutez la méthode suivante à votre shell ou d'une tâche, puis l'exécuter chaque fois que vous devez afin de modifier votre profil de données (voir la liste dans app/config/database.php) à la volée:

function change_database_profile($database = 'default') { 
    $connected = ConnectionManager::getDataSource($database); 
    if($connected->isConnected()) { 
     return true; 
    } 
    return false; 
}