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()-&gt;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] 不可实例化

如何在 Laravel Lumen 8 中设置响应的 cookie

Lumen (5.8.12) - 带前缀的多个可选参数

Lumen手记:lumen的初始化——app初始化

Lumen 5.8 启用 cors

使用 API 密钥策略的 Lumen API 身份验证