流明 8 未使用 .env.testing
Lumen 8 not using .env.testing
我正在使用 Lumen 8。
我想使用 .env.testing
里面的配置
但它总是读取 .env
中的配置
tests/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());
它 returns db_local
而不是 db_testing
我不想在里面添加我所有的配置 phpunit.xml
缺什么?我该怎么办?
有趣的是,流明在删除 artisan 支持后不支持动态环境文件名,Link 到 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;
}
....
这是另一个 link,可能 help
您正在将您的环境文件加载到一个新的存储库实例中,但您的 lumen 应用程序不知道该存储库实例存在。
接下来,当您的 bootstrap/app.php
文件运行时,它将创建存储库实例,其中加载了 lumen 知道如何使用的普通 .env
文件。
最干净的解决方案可能是删除您的 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
文件。
注意:所有理论都基于阅读代码。未经测试。
@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
里面的配置
但它总是读取 .env
tests/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());
它 returns db_local
而不是 db_testing
我不想在里面添加我所有的配置 phpunit.xml
缺什么?我该怎么办?
有趣的是,流明在删除 artisan 支持后不支持动态环境文件名,Link 到 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;
}
....
这是另一个 link,可能 help
您正在将您的环境文件加载到一个新的存储库实例中,但您的 lumen 应用程序不知道该存储库实例存在。
接下来,当您的 bootstrap/app.php
文件运行时,它将创建存储库实例,其中加载了 lumen 知道如何使用的普通 .env
文件。
最干净的解决方案可能是删除您的 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
文件。
注意:所有理论都基于阅读代码。未经测试。
@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();