2014-03-27 53 views
0

我們正在開發基於Laravel 4的多個應用程序。這些應用程序在同一個Web服務器上運行。Laravel4種子特定環境

Laravel4環境檢測基於主機名稱,因爲我們在同一臺機器上有多個應用程序,所以它很糟糕。 我們在檢測區域創建了一個解決方案,以便根據url設置環境。

我們在更新應用程序數據庫時運行artisan --env=my_env migrate命令。問題在播種,種子命令沒有env選項,所以它會嘗試根據主機名種子數據庫,這將是不正確的。

我試圖整天找到一個解決方案,但我無法在互聯網上找到任何東西,並且我嘗試構建新的命令只是花費了太多的時間和精力。

播種時有人知道如何設置環境嗎?

PS:我通過Grunt在服務器上運行命令,我知道環境 - 將它注入到命令中。

回答

1

我想到了一些情況天,得到的結論是,我們正在試圖做的是不是正確的方法。

正確的方法是每個應用程序都有自己的配置文件 - 使用不同的envs-。這樣Laravel的解析函數可以正常工作。 現在的情況是,我們在一個應用程序中有多個客戶端,並且在一個應用程序中使用-clients-配置文件。在這種情況下,主機名解析將返回一個客戶端 - 每次相同的客戶端配置是在同一臺機器上運行的客戶端應用程序。

我們的解決方案 我們打算寫一個部署腳本爲不同的客戶端,使每一個客戶都有自己的應用程序與他們CONFIGS只(複製應用程序,複製/覆蓋客戶端配置爲應用程序)。

解決方法 @Antonio Carlos Ribeiro的回答工作不正常,但對我們的應用程序有很大的影響。我們使用不同的環境,通過此解決方案,我們必須在所有環境中使用相同的用戶/傳遞信息,或提供不同的.environment文件。

我寫了一個Artisan命令來使我們的部署工作暫時。該命令可以使用所提供環境的配置爲數據庫創建種子(php artisan db:seed_env my_env)。

use Illuminate\Console\Command; 
use Illuminate\Config\Repository; 
use Symfony\Component\Console\Input\InputOption; 
use Symfony\Component\Console\Input\InputArgument; 

class SeedEnvironmentDb extends Command { 

    /** 
    * The console command name. 
    * 
    * @var string 
    */ 
    protected $name = 'db:seed_env'; 

    /** 
    * The console command description. 
    * 
    * @var string 
    */ 
    protected $description = 'Seed a database with the configuration of the environment'; 

    /** 
    * Create a new command instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    /** 
    * Execute the console command. 
    * 
    * @return mixed 
    */ 
    public function fire() 
    { 
     $cmd = $this; 
     $app = App::make('app'); 

     // force the environment to the given one. 
     $env = $app->detectEnvironment(function() use ($cmd) { 
      return $cmd->argument('environment'); 
     }); 

     // create new config with the correct environment and overwrite the current one. 
     $app->instance('config', $config = new Repository(
      $app->getConfigLoader(), $env 
     )); 

     // trigger the db seed (now with the correct environment) 
     $this->call('db:seed'); 
    } 

    /** 
    * Get the console command arguments. 
    * 
    * @return array 
    */ 
    protected function getArguments() 
    { 
     return array(
      array('environment', InputArgument::REQUIRED, 'The environment to seed.'), 
     ); 
    } 

    /** 
    * Get the console command options. 
    * 
    * @return array 
    */ 
    protected function getOptions() 
    { 
     return array(); 
    } 

} 
+1

不錯''app-> instance()'破解。感謝分享它。 –

2

你指出的非常好,Laravel猜測環境吮吸我們用用它的方式,但你可以改變:

這是我做完美設置我的環境,所以我沒有處理與主機名,仍然不會讓我的本地環境與分期和生產衝突。

在應用程序的根目錄下創建一個.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'; 

因爲我希望它失敗每個服務器我部署我的應用程序上,要永遠不會忘記他們配置我的環境。

然後你只需在你的DatabaseSeeder類選擇環境:

public function run() 
{ 
    if(App::environment() === 'development') 
    { 
     $this->call('UserTableSeeder'); 
    } 
} 
+0

感謝您的詳細解答!對於我們的情況,這不是最好的解決方案(很多改變)。查看我的答案瞭解更多詳情。 (+1給你先生) –