使用不同的 .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 命令的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 本地运行 artisan 命令效果 VM 环境