Lumen 8 不使用 .env.testing
Posted
技术标签:
【中文标题】Lumen 8 不使用 .env.testing【英文标题】:Lumen 8 not using .env.testing 【发布时间】:2021-04-19 03:14:19 【问题描述】:我正在使用 Lumen 8。
我想使用.env.testing
里面的配置
但它总是读取.env
里面的配置
测试/TestCase.php
<?php
use Dotenv\Dotenv;
abstract class TestCase extends Tests\Utilities\UnitTest\Testing\TestCase
public static function setUpBeforeClass(): void
Dotenv::createImmutable(dirname(__DIR__), '.env.testing')->load();
parent::setUpBeforeClass();
public function createApplication()
return require __DIR__ . '/../bootstrap/app.php';
.env.testing
APP_ENV=testing
APP_DEBUG=false
DB_CONNECTION=mysql
DB_HOST=db_testing
DB_PORT=3307
DB_DATABASE=db_testing
DB_USERNAME=db_username
DB_PASSWORD=db_password
.env
APP_ENV=local
APP_DEBUG=false
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3307
DB_DATABASE=db_local
DB_USERNAME=db_username
DB_PASSWORD=db_password
当我调试测试文件时
dd(DB::connection()->getDatabaseName());
它返回db_local
而不是db_testing
我不想在phpunit.xml
中添加我的所有配置
缺什么?我该怎么办?
【问题讨论】:
您是否使用 --env=testing 运行 artisan ? php 工匠 --env=testing 不。是必需的吗?我只是在运行我的单元测试,并弄清楚为什么我的单元测试仍然使用 .env.testing 而不是 .env 不。我已经看到了。 【参考方案1】:您正在将环境文件加载到新的存储库实例中,但您的 lumen 应用程序不知道存储库实例存在。
接下来,当您的 bootstrap/app.php
文件运行时,它将创建存储库实例,该存储库实例加载了您的正常 .env
文件,而 lumen 知道如何使用。
最干净的解决方案可能是删除您的 setUpBeforeClass()
方法,只需更新您的 bootstrap/app.php
文件以支持加载不同的 .env 文件。
一个例子:
$env = env('APP_ENV');
$file = '.env.'.$env;
// If the specific environment file doesn't exist, null out the $file variable.
if (!file_exists(dirname(__DIR__).'/'.$file))
$file = null;
// Pass in the .env file to load. If no specific environment file
// should be loaded, the $file parameter should be null.
(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
dirname(__DIR__),
$file
))->bootstrap();
如果您使用此代码更新您的bootstrap/app.php
文件,那么您可以在phpunit.xml
文件中指定一个环境变量来将APP_ENV
变量设置为testing
。如果这样做,上面的代码将加载.env.testing
文件。
注意:所有理论都基于阅读代码。未经测试。
【讨论】:
【参考方案2】:lumen 移除 artisan 支持后不支持动态环境文件名,这很有趣,链接到Issue
所以基本上你必须进入手动模式
在您的 bootstrap.app 文件中
// boostrap.php
(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
\dirname(__DIR__),
))->bootstrap();
class LoadEnvironmentVariables
protected $filePath;
protected $fileName;
// change the $name, i.e the env file name to your env file manually
public function __construct($path, $name = null)
$this->filePath = $path;
$this->fileName = $name;
....
这是另一个链接,可能是help
【讨论】:
【参考方案3】:@patricus 答案的简化版:
使用此更改更新您的 bootstrap/app.php
:
$env_file = '.env.' . env('APP_ENV');
(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
dirname(__DIR__), file_exists(dirname(__DIR__) . '/' . $env_file) ? $env_file : null
))->bootstrap();
【讨论】:
以上是关于Lumen 8 不使用 .env.testing的主要内容,如果未能解决你的问题,请参考以下文章
如何在 lumen 5.8.* 中使用 dingo 修复实现 jwt?目标 [Dingo\Api\Contract\Routing\Adapter] 不可实例化