2014-02-05 62 views
1

我已經將我的laravel應用程序部署到彈性beanstalk環境中。這個程序檢測周邊環境與這段代碼在引導/ start.phplaravel enviroment當命令行不同於瀏覽器時

$env = $app->detectEnvironment(function() { 
    return getenv('APP_ENV') ?: 'local'; 
}); 

當彈性魔豆開始運行,我已經設置了它的配置文件,如果參數設置爲檢測。在這種情況下,我有這個參數設置爲開發和配置文件然後基於這個環境變量,即

APP_ENV = development 
DB_HOST = rds dev endpoint 
DB_NAME = rds dev db name 
DB_USERNAME = dev username 
DB_PASSWORD = devdb pass 

當我訪問在按預期工作瀏覽器的應用程序,它被正確連接到開發D b。

當我ssh到服務器,並嘗試運行

php artisan migrate 

我得到一個PDO異常

當我運行

php artisan env 

甚至返回本地雖然沒有這樣的文件或目錄定義了環境變量APP_ENV。我非常確定這個變量是被定義的,因爲當瀏覽器中的laravel錯誤時,我可以看到具有服務器/請求數據中的值開發的變量以及在環境啓動時創建的其他環境變量

我是什麼失蹤?

編輯,包括基於ANTONIOS回答個性化的解決方案

.environment

<?php 
if (getenv('PARAM1') === false) { 
    return false; 
} else { 
    switch (getenv('PARAM1')) { 
     case 'development': 

      return array(
       'APP_ENV' => 'development', 

       'DB_HOST' => '***', 
       'DB_NAME' => '***', 
       'DB_USERNAME' => '***', 
       'DB_PASSWORD' => '***', 
       ); 
      break; 

     case 'staging': 

      return array(
       'APP_ENV' => 'staging', 

       'DB_HOST' => '***', 
       'DB_NAME' => '***', 
       'DB_USERNAME' => '***', 
       'DB_PASSWORD' => '***', 
       ); 
      break; 

     case 'production': 

      return array(
       'APP_ENV' => 'production', 

       'DB_HOST' => '***', 
       'DB_NAME' => '***', 
       'DB_USERNAME' => '***', 
       'DB_PASSWORD' => '***', 
       ); 
      break; 
    } 
} 

start.php

$env = require __DIR__.'/../.environment'; 

if ($env !== false) { 
    foreach ($env as $key => $value) { 
     putenv(sprintf('%s=%s', $key, $value)); 
    } 
} 

$env = $app->detectEnvironment(function() { 
    return getenv('APP_ENV') ?: 'local'; 
}); 
+0

好吧,但是,你得到你所有的變量你的git?我和你的情況完全一樣 –

回答

3

當您運行

php artisan migrate 

PHP運行不同的用戶下,而不是你的Web服務器,因此你需要:

php artisan migrate --env=development 

編輯

經與CLI和Web麻煩的原因之一,我不使用這些Web服務器ENV瓦爾。這是我做我的環境:

創建應用程序的根.environment文件並定義您的環境:

<?php 

return array(

    'APP_ENV' => 'development', 

    'POSTGRESQL.HOST' => 'localhost', 
    'POSTGRESQL.DATABASE_NAME' => 'laraveldatabase', 
    'POSTGRESQL.DATABASE_USER' => 'laraveluser', 
    'POSTGRESQL.DATABASE_PASSWORD' => '!Bassw0rT', 

); 

將它添加到您的應用程序.gitignore文件,這樣你就不會冒險讓你的密碼發送到Github。

就在$app->detectEnvironment之前,加載。環境文件的PHP環境:

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

然後你只需要使用它:

$env = $app->detectEnvironment(function() { 
    return getenv('APP_ENV'); 
}); 

它將工作無處不在:

<?php 

return array(

    'connections' => array(

     'postgresql' => array(
       'driver' => 'pgsql', 
       'host'  => getenv('POSTGRESQL.HOST'), 
       'database' => getenv('POSTGRESQL.DATABASE_NAME'), 
       'username' => getenv('POSTGRESQL.DATABASE_USER'), 
       'password' => getenv('POSTGRESQL.DATABASE_PASSWORD'), 
       'charset' => 'utf8', 
       'prefix' => '', 
       'schema' => 'public', 
     ), 

    ), 

); 

注意,我不做

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

因爲我想要我t在我將應用程序部署到的每臺服務器上都會失敗。

+0

這很有道理,雖然我只是嘗試過,但得到了同樣的錯誤。因爲它使用Web服務器以外的其他用戶,它是否可以訪問它需要的環境變量?我只是重讀了我的aws支持案例,當時我得到了設置eniroment變量的方法,他說'還有一點值得注意的是,以這種方式設置的自定義環境變量將無法通過控制檯進行修改。 「 – Ir1sh

+0

只是編輯,向你展示我的方式。 –

+0

謝謝當我有機會時,我會試試這個嘗試 – Ir1sh