2014-03-27 62 views
0

我想爲我的database.php有一個本地開發環境配置。我在我的應用程序中創建了一個新的配置導演,並將database.php文件複製到其中。我使用的MongoDB和生產,我使用的是副本與多個服務器設置,但在本地,我只是在運行一臺服務器,所以我的生產連接方式有更多的選擇:如何替換環境特定的配置,而不是級聯

製作:

... 
'connections' => array(

    'mongodb' => array(
     'driver' => 'mongodb', 
     'host'  => array('mongoDBA', 'mongoDBB'), 
     'port'  => 27017, 
     'username' => 'myUserName', 
     'password' => 'myPassword', 
     'database' => 'theDatabase', 
     'options' => array('replicaSet' => 'myReplicaSet') 
    ) 
), 

地方:

... 
'connections' => array(

    'mongodb' => array(
     'driver' => 'mongodb', 
     'host'  => 'localhost', 
     'port'  => 27017, 
     'database' => 'theDatabase' 
    ) 
), 

的問題是,當我的本地環境配置負載,它融合了 「連接」 陣列。我想要一種完全替代「mongodb」連接的方式,因此它可以是其中一種,也可以不是兩種。

我該如何做到這一點?

回答

1

創建不同的配置文件集:

app/config/local/database.php 
app/config/production/database.php 

並刪除文件(或者你不希望它是什麼):

app/config/database.php 

而且你必須設置你的環境

local 
development 

編輯

這就是我如何完美地設置我的環境,所以我不必處理主機名,仍然不會讓我的本地環境與分段和生產衝突。

在應用程序的根目錄下創建一個.environment文件並定義您的環境,並添加您的敏感信息吧:

<?php 

return array(

    'APPLICATION_ENV' => 'development', /// this is where you will set your environment 

    'DB_HOST' => 'localhost', 
    'DB_DATABASE_NAME' => 'laraveldatabase', 
    'DB_DATABASE_USER' => 'laraveluser', 
    'DB_DATABASE_PASSWORD' => '!Bassw0rT', 

); 

它添加到您.gitignore文件,這樣你就不會冒險讓您的密碼發送Github或任何其他您的服務器。

$app->detectEnvironment前右,文件bootstrap/start.php中,加載.environment文件PHP環境:

foreach(require __DIR__.'/../.environment' as $key => $value) 
{ 
    putenv(sprintf('%s=%s', $key, $value)); 
} 

然後你只需要使用它:

$env = $app->detectEnvironment(function() { 

    return getenv('APPLICATION_ENV'); // your environment name is in that file! 

}); 

它將工作無處不在,所以你不需要單獨的開發和生產dirs:

<?php 

return array(

    'connections' => array(

     'postgresql' => array(
       'driver' => 'pgsql', 
       'host'  => getenv('DB_HOST'), 
       'database' => getenv('DB_DATABASE_NAME'), 
       'username' => getenv('DB_DATABASE_USER'), 
       'password' => getenv('DB_DATABASE_PASSWORD'), 
       'charset' => 'utf8', 
       'prefix' => '', 
       'schema' => 'public', 
     ), 

    ), 

); 

請注意,我沒有設置回退:

return getenv('APPLICATION_ENV') ?: 'local'; 

因爲,如果我不設置文件,我希望它每個服務器我部署我的應用程序上的失敗

+0

有一個警告。該應用程序託管在亞馬遜的雲中,當它自動縮放時,可以添加新的實例(使用新的主機名)。如果我有一個特定於生產的目錄,而不是默認使用生產,那麼我是否不需要指定每個要運行生產的單個主機名? – Thelonias

+0

它是否將所有生產文件複製到新實例? –

+0

是的,它在新實例啓動時從我們的Git倉庫中提取,因此它與我們運行的任何其他服務器相同,但是機器的主機名會不同,因此'detectEnvironment'中的數組不會包含主機名爲新的實例。 – Thelonias