2016-04-26 9 views
2

Ich arbeite mit CakePHP v3 und möchte die Anwendung in zwei verschiedenen Umgebungen installieren, eine für die Entwicklung und eine für die Produktionsanwendung. Beide Installationen sollten aus genau denselben Dateien (und Dateiinhalten) bestehen, also könnte ich 'git' oder 'svn' verwenden, um die Anwendung einfach zu implementieren.Wie CakePHP 3 wählen Datenbankverbindung durch Apache Umgebungsvariable

Wenn beide Umgebungen auf demselben Computer gehostet werden, brauche ich andere Datenbankeinstellungen (damit das Entwicklungsumgebung eine eigene "Test" DB verwendet). Ich dachte daran, zwei 'Datenquellen' in app.php zu konfigurieren, die 'Standard' für die Produktion und eine 'Entwicklung'.

Aber wie kann ich zwischen beiden Quellen wechseln?

Um genauer zu sein: Derzeit definiere ich die folgende Umgebungsvariable in meinem Apache Config für die Entwicklungsumgebung:

SetEnv CAKEPHP_DEBUG 1 

Dann änderte ich die Definition von ‚debug‘ in der app.php-Datei wie folgt:

'debug' => (bool)getenv('CAKEPHP_DEBUG'), 

Dies aktiviert DEBUG-Modus nur auf dem Entwicklungscomputer. Jetzt möchte ich auch die Datenbankkonfiguration auf die gleiche einfache Weise ändern.

(Ich fand bereits einige Lösungen für cakephp v2, aber alle von ihnen sind ziemlich alt, und ich bin nicht sicher, was der beste Weg ist es in CakePHP v3 zu tun.)

Antwort

3

Die manual sagt

Sie können in Ihrer Konfigurationsdatei beliebig viele Verbindungen definieren. Sie können zur Laufzeit weitere Verbindungen definieren, indem Sie Cake \ Datasource \ ConnectionManager :: config() verwenden.

Also ich denke, der Wert von Debug überprüfen in AppControllerbeforeFilter und die Verbindung Standarddatenbank

AppController.php

if(Configure::read('debug') == 1) 
{ 
    ConnectionManager::config('default', [ 
     'className' => 'Cake\Database\Connection', 
     'driver' => 'Cake\Database\Driver\Mysql', 
     'persistent' => false, 
     'host' => 'dev_server', 
     'username' => 'dev_username', 
     'password' => 'dev_passwd', 
     'database' => 'development', 
     'encoding' => 'utf8', 
     'timezone' => 'UTC', 
     'cacheMetadata' => true, 
    ]); 
} 

Ich denke, ändern Sie etwas ähnliches in App tun können .php mit dem ternären Operator

app.php

'Datasources' => [ 
    'default' => getenv('CAKEPHP_DEBUG')== 1 ? [ /* debug params */ ] : [ /* default params */] 
    ... 
] 

Aber irgendwie scheint es nicht die ‚saubere‘ Art und Weise, es zu tun

Ich denke, dass ein sauberer Weg, um beiden Konfigurationen in app.php einstellen würde und dann in AppController wählen, welche Konfigurationen

app.php

'Datasources' => [ 
    'debug' => [ /* debug params */ ], 
    'default' => [ /* default params */] 
] 

Tabellendatei verwenden

public static function defaultConnectionName() { 
    if(Configure::read('debug') == 1) 
     return 'debug'; 
    return 'default'; 
} 
+0

Scheint zu arbeiten, danke!Allerdings würde ich lieber die DB-Konfiguration in App.php statt AppController.php setzen. –

+0

Ich habe bearbeitet, werfen Sie einen Blick – arilia

+0

Danke für das Update! Der ternäre Operator funktioniert perfekt! Die Lösung mit 'defaultConnectionName 'funktioniert nicht: wenn ich die Dokumente richtig lese, muss diese Methode in jeder * Table-Klasse überschrieben werden und ich möchte den Code nicht so oft duplizieren ... –