Laravel 4.2,Artisan :: call()忽略--env选项

时间:2014-07-09 00:05:18

标签: laravel-4

我正在构建一个需要创建新数据库,通过网页执行迁移和种子数据库数据的应用程序。

我正在尝试使用Laravel 4.2中的以下代码实现此目的。注意,这是在我设置的控制器内。

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

无论我使用“--env”选项传递什么环境,运行迁移的环境都是网站当前运行的当前环境。 IE浏览器。如果我在我的本地环境中运行,并运行上述环境,它将在本地环境中执行迁移,这不是我想要做的。

如果我从命令行运行等效命令php artisan --env=production migrate,我会得到我想要实现的结果。目前,我已经通过passthru()过去了,但如果可以的话,我想利用这个Artisan门面。

有谁知道这是怎么回事?

2 个答案:

答案 0 :(得分:1)

--env是在应用程序启动时指定应用程序环境的选项。换句话说,如果指定--env选项,Laravel将使用您指定的环境,而不是在环境检测方法中运行检测方法。

因此,如果您通过CLI使用artisan选项运行--env,则在启动文件中,artisan可以从--env变量中检测$_SERVER选项,指定应用程序环境并运行您的命令。

相反,当您调用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))而不是更改环境。

答案 1 :(得分:1)

这不是一种愉快的方式,但它确实有效。

假设您的Artisan环境基于$_SERVER['HTTP_HOST']并且您知道将加载环境的HTTP_HOST,那么您可以在调用start.php之前手动设置它。

我用它根据我在Behat个人资料中使用的base_url来定义Artisan环境。这样我就可以在运行测试之前配置我的数据库。

/**
 * @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)
    );
}