使用不同的 .env 从其他 Artisan 命令调用 Artisan 命令

Posted

技术标签:

【中文标题】使用不同的 .env 从其他 Artisan 命令调用 Artisan 命令【英文标题】:Calling Artisan Commands from other Artisan Commands using different .env 【发布时间】:2021-02-11 01:34:11 【问题描述】:

我想使用.env.testing,我读到了here:

您也可以创建一个 .env.testing 文件。当运行 phpUnit 测试或使用 --env=testing 选项执行 Artisan 命令时,此文件将覆盖 .env 文件。

我有一个应该创建我的测试数据库的工匠命令。该命令在他的句柄方法中使用php artisan testdb:fresh和calling another command触发:

public function handle()

    if ($this->isProduction()) 
        $this->errorMessageTestingDatabase();
        return;
    

    $this->call('migrate:fresh', ['--env' => 'testing',  '--seed' => true]);

但是,--env=testing 标志似乎被忽略了。连接到 db 异常失败。

但是,如果我运行命令

php artisan testdb:fresh --env=testing 

它有效。使用 Artisan 命令调用 Artisan 命令时无法传递 env 标志?

【问题讨论】:

--seed 是否正确执行?如果是这样,可能是因为--env 不在migrate:fresh 的范围内。 @RobBiermann 当我没有通过--env=testing 时,它在数据库连接上失败。当我通过它时,种子会被执行。 你见过***.com/questions/24643449/…吗? @RobBiermann 不,谢谢你告诉我,我的是重复的 我猜你可以使用exec('php artisan migrate:fresh --env=testing --seed=true') 来“解决”它,因为此代码不会被最终用户注入任何东西 【参考方案1】:

我认为php artisan testdb:fresh --env=testing 是唯一简单的方法,但是对于所有子命令(您可能不想要),这会将您的env 放在testing 上。

要对单个命令执行此操作,请通过覆盖所需的设置来更新应用程序的配置,如下所示(您可能需要切换更多键,而不仅仅是 DB_DATABASE):

$testEnv = [];
//load .env.testing and make a clean key value pair
$testEnvArray = explode("\n", file_get_contents(base_path('.env.testing'))); 
foreach($testEnvArray as $row) 
    $columns = explode('=',$row);
    if(count($columns) === 2)
        $testEnv[$columns[0]] = $columns[1];

//Now you have access to test env keys.
config(['database.connections.mysql.database' => $testEnv['DB_DATABASE']]);//override.
...
$this->call('migrate:reset');
... //Put code here that needs test env settings.
config(['database.connections.mysql.database' => env('DB_DATABASE')]);//Reset.
...//Put code here that needs normal env settings.

【讨论】:

还有其他人能够让它工作吗?我在config([...]) 之后运行的后续$this->call('install') 命令忽略了新创建和配置的数据库。 gist.github.com/th3coop/…有人有什么建议吗?

以上是关于使用不同的 .env 从其他 Artisan 命令调用 Artisan 命令的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.5artisan命令

Laravel 本地运行 artisan 命令效果 VM 环境

无法通过 artisan 命令运行迁移

laravel5环境配置

php artisan test 仍然加载 .env 而不是 .env.testing

Laravel Artisan CLI 没有设置正确的 URL