2014-07-09 47 views
3

我正在構建一個需要創建新數據庫,通過網頁執行遷移和種子數據庫數據的應用程序。Laravel 4.2,Artisan :: call()忽略--env選項

我試圖用Laravel 4.2中的以下代碼實現此目的。請注意,這是在我設置的控制器內。

Artisan::call("migrate", array(
    "--env" => "production" 
)); 

無論我通過什麼樣的環境與「--env」選項,遷移已運行環境是當前環境下,該網站當前正在運行。 IE瀏覽器。如果我在本地環境中運行,並且運行上述操作,它將在本地環境中執行遷移,這不是我期望的遷移。

如果我從命令行運行等效命令php artisan --env=production migrate,我得到了我期望實現的結果。目前,我通過passthru()過去了,但如果可以的話,我想利用這個工匠的外觀。

有誰知道這是怎麼回事?

回答

1

這不是一個愉快的方式來做到這一點,但它的工作原理。

假設你的工匠環境是基於$_SERVER['HTTP_HOST'],你知道,這將載入您的環境,那麼你可以調用start.php

我用這個基礎上,我的base_url定義工匠環境之前手動設置的HTTP_HOST正在使用Behat配置文件。這樣我可以在運行測試之前配置燈具數據庫。

/** 
* @BeforeSuite 
*/ 
public static function runFixtures(SuiteEvent $suiteEvent) { 

    // Get the environment domain 
    $parameters = $suiteEvent->getContextParameters(); 
    $baseUrl = $parameters['base_url']; 
    $urlParts = parse_url($baseUrl); 
    $_SERVER['HTTP_HOST'] = $urlParts['host']; 

    // Now call start.php 
    require_once 'bootstrap/start.php'; 

    // Call Artisan 
    $stream = fopen('php://output', 'w'); 
    Artisan::call(
     'migrate:refresh', 
     [ 
      '--seed' => true, 
     ], 
     new StreamOutput($stream) 
    ); 
} 
+0

作爲對此的注意事項,您必須將base_url添加到上下文參數,它不會從您的擴展參數複製。 – DanielM

0

--env是應用程序啓動時指定應用程序環境的選項。換句話說,如果您指定--env選項,則Laravel將使用您指定的環境,而不是在環境檢測方法中運行檢測方法。

因此,如果您通過CLI與--env選項運行artisan,在啓動文件,artisan可以從$_SERVER變量檢測--env選項,指定的應用環境和運行命令。

相反,當您撥打Artisan::call()時,Laravel將解析控制檯應用程序類(Illuminate\Console\Application)並運行您的命令。由於您的應用程序已啓動,因此Application只是在未檢測到環境的情況下運行您的命令。更多結束,latest version of migration command class使用應用程序環境獲得數據庫連接

因此,當您撥打Artisan::call()時,--env選項被完全省略。

只是我的意見。如果您確實想避免使用passthru()函數,則可以將app/config/database.php中的生產數據庫連接名稱重命名爲唯一名稱,例如production並將您的默認數據庫連接設置爲您的新名稱。當你想遷移生產數據庫時,只需撥打Artisan::call('migrate', array('--database' => 'production', '--force' => true))而不是改變環境。

+0

對不起,如果我的問題不清楚 - 這不是我想要做的。我想在與當前不同的環境中調用migrate命令。 IE瀏覽器。當站點當前在「本地」環境中運行時,我想在「生產」環境中運行migrate命令。 看來, - env選項被忽略。 –

+0

我很抱歉我的錯。我弄明白爲什麼'env'選項不起作用,我發現遷移命令總是使用應用程序實例中的環境,因此省略了'env'選項。 – kunemata

+0

''--force'=> true'會拋出'--force'選項不存在。「..有沒有另外一種方法? –