2016-04-26 26 views
2

我正在使用cakephp v3並且希望在兩個不同的環境中安裝應用程序,一個用於開發,一個用於生產用途。這兩個安裝應該包含完全相同的文件(和文件內容),所以我可以使用'git'或'svn'來輕鬆部署應用程序。如何讓CakePHP 3通過Apache環境變量選擇數據庫連接

如果兩個環境都託管在同一臺機器上,我需要不同的數據庫設置(以便開發環境使用它自己的「測試」數據庫)。我想在app.php中配置兩個「數據源」,這是'默認'生產和'開發'的一個。

但是,如何在兩個來源之間切換?

更具體:目前我定義以下環境變量在我的Apache配置的開發環境:

SetEnv CAKEPHP_DEBUG 1 

然後我在app.php文件中像這樣改變了「調試」的定義:

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

這使DEBUG模式只在開發機器上啓用。現在我也想以同樣簡單的方式切換數據庫配置。

(我已經找到了CakePHP的v2的一些解決方案,但個個都是很老了,我不知道什麼是做在CakePHP中V3的最好方式。)

回答

3

manual

您可以在配置 文件中根據需要定義多個連接。您還可以使用 Cake \ Datasource \ ConnectionManager :: config()在運行時定義其他連接。

所以我想你可以檢查調試的值AppControllerbeforeFilter和更改默認的數據庫連接

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

我覺得你可以做應用類似的東西.php使用三元運算符

app.php

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

但不知何故,似乎是「乾淨」的方式做到這一點

我認爲一個更清潔的方式是設置在app.php,然後在AppController中選擇什麼配置,這兩種配置它不使用

app.php

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

表文件

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

似乎工作,謝謝!不過,我更喜歡將數據庫配置放在app.php而不是AppController.php中。 –

+0

我編輯了一下,看看 – arilia

+0

感謝您的更新!三元運算符完美運行!具有'defaultConnectionName'的解決方案不起作用:如果我正確地閱讀了文檔,則必須在每個* Table類中覆蓋此方法,並且我不希望經常複製代碼... –