【问题标题】:Laravel 4.2, Artisan::call() ignoring --env optionLaravel 4.2,Artisan::call() 忽略 --env 选项
【发布时间】:2014-08-29 20:59:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: laravel-4


【解决方案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)
    );
}

【讨论】:

  • 附带说明,您必须将 base_url 添加到您的上下文参数中,它不会从您的扩展参数中复制。
【解决方案2】:

--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)),而不是改变环境。

【讨论】:

  • 对不起,如果我的问题不清楚 - 这不是我想要做的。我想在与当前环境不同的环境中调用 migrate 命令。 IE。当站点当前在“本地”环境中运行时,我想在“生产”环境中运行迁移命令。似乎 --env 选项被忽略了。
  • 对不起我的错。我弄清楚为什么env 选项不起作用,我发现迁移命令总是使用应用程序实例中的环境,因此省略了env 选项。
  • '--force'=> true 抛出 The "--force" option does not exist... 还有其他方法吗?
  • @JordiPuigdellívol 您使用的是哪个版本?如果您使用 4.1 或更低版本,请忽略它。
  • 我使用的是 4.2,我发现 --force 不适用于 install 命令,但它适用于其他命令以及播种机
猜你喜欢
  • 2014-08-05
  • 2017-06-10
  • 2019-07-27
  • 2016-08-31
  • 1970-01-01
  • 2019-06-05
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多