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

Laravel 4 Laravel 4.2,Artisan::call()忽略--env选项,laravel-4,Laravel 4,我正在构建一个应用程序,该应用程序需要创建一个新的数据库,执行迁移,并通过网页为数据库数据种子 我正试图通过Laravel4.2中的以下代码实现这一点。注意,这是在我设置的控制器内 Artisan::call("migrate", array( "--env" => "production" )); 无论使用“-env”选项传递哪个环境,运行迁移的环境都是站点当前运行的当前环境。也就是说,如果我在本地环境上运行,并且我运行了上面的操作,它将在本地环境上执行迁移,这不是我想要做的

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

我正试图通过Laravel4.2中的以下代码实现这一点。注意,这是在我设置的控制器内

Artisan::call("migrate", array(
    "--env" => "production"
));
无论使用“-env”选项传递哪个环境,运行迁移的环境都是站点当前运行的当前环境。也就是说,如果我在本地环境上运行,并且我运行了上面的操作,它将在本地环境上执行迁移,这不是我想要做的

如果我从命令行运行等效的命令
phpartisan--env=production migrate
,我会得到我想要得到的结果。目前,我正在通过
passthru()
克服这个问题,但如果可以的话,我想利用这个Artisan外观

有人知道这是怎么回事吗?

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

因此,如果通过CLI使用
--env
选项运行
artisan
,则在开始文件中,
artisan
可以从
$\u服务器
变量中检测
--env
选项,指定应用程序环境并运行命令

相反,当您调用
Artisan::call()
时,Laravel将解析console应用程序类(
Lightning\console\application
)并运行您的命令。因为您的应用程序已启动,所以
应用程序
只运行您的命令而不检测环境。此外,请使用应用程序环境获取数据库连接

因此,当调用
Artisan::call()
时,
--env
选项被完全忽略


只是我的意见。如果确实要避免使用
passthru()
函数,可以将
app/config/database.php
中的生产数据库连接名称重命名为唯一名称,例如
production
,并将默认数据库连接设置为新名称。当您想要迁移生产数据库时,只需调用Artisan::call('migrate',array('--database'=>'production','--force'=>true)),而不是更改环境。

这不是一种令人愉快的方法,但它可以工作

假设您的Artisan环境基于
$\u服务器['HTTP\u HOST']
,并且您知道将加载您的环境的HTTP\u主机,那么您可以在调用start.php之前手动设置它

我用它来定义Artisan环境,它基于我在Behat配置文件中使用的基本url。这样,我可以在运行测试之前配置数据库

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

对不起,如果我的问题不清楚-这不是我想要做的。我想在与当前环境不同的环境中调用migrate命令。例如,当站点当前在“本地”环境中运行时,我希望在“生产”环境中运行migrate命令。似乎忽略了--env选项。我为我的错误感到抱歉。我想知道为什么
env
选项不起作用,我发现迁移命令总是从应用程序实例使用环境,因此
env
选项被省略。
'--force'=>true
抛出一个
选项--force>不存在。
。。还有别的办法吗?@JordiPuigdellívol你用了哪个版本?如果您使用的是4.1或更低版本,请忽略它。我使用的是4.2,我发现--force不适用于install命令,但它适用于其他命令以及Seeders。作为一个补充说明,您必须将base_url添加到您的上下文参数中,它不会从扩展参数复制。根据Laravel版本的不同,请参阅以下错误: