使用附加环境文件配置 Laravel

2024 年 5 月 24 日

在 Laravel 中,您可以配置将加载的其他环境文件,而不是 .env 文件。此功能对于测试很有帮助,您可以在其中加载 .env.testing 环境文件而不是默认的。您通常不需要使用此功能,但很高兴知道通过设置 APP_ENV 环境变量,Laravel 可以检测自定义配置。

CLI 示例

此功能最简单的示例是在使用 Artisan 控制台甚至是运行 Laravel 时使用不同的环境文件 phpunit 命令行界面。

使用 Artisan 命令,您还可以使用不同的 .env 文件使用 --env 标志或定义 APP_ENV 。例如,运行以下命令,Laravel 将查找 .env.demo :

# Set up `.env.demo`
cp .env .env.demo
echo "\nEXAMPLE_SETTING=demo" >> .env.demo

# Use the `demo` env

php artisan tinker --env=demo

# Or set APP_ENV
APP_ENV=demo php artisan tinker

如果找到,Laravel 将不会加载 .env 文件而是加载 .env.demo :

使用 .env.demo 代替 .env 的示例
使用示例 .env.demo 代替 .env

使用 .env.testing 用于 PHPUnit 测试

基于我们对加载特定 ENV 文件(如果存在)的 Laravel 框架的了解,在 PHPUnit 中运行 Laravel 功能测试将使用 .env 默认文件。使用 .env 用于测试和本地开发可能很快会导致问题,例如配置单独的数据库进行测试。您可以在中定义数据库连接详细信息 phpunit.xml ,但我们还要看看将它们设置为 .env.testing

PHPUnit 定义了一个 APP_ENV 环境变量在 phpunit.xml ,这意味着 Laravel 寻找 .env.testing 引导功能测试时的文件,因为 phpunit.xml 文件定义 APP_ENV 在 Laravel 框架在功能测试中启动之前:

<env name="APP_ENV" value="testing"/>

这意味着我们可以复制股票 .env 文件到 .env.testing 并避免在测试期间混合两个文件:

cp .env .env.testing

echo "\nEXAMPLE_SETTING=testing" >> .env.testing

您可以在中配置环境变量 phpunit.xml 。不过,我喜欢使用 .env.testing 文件以确保专门用于测试的干净环境。是否进行版本控制也取决于您 .env.testing 或忽略它 .gitignore

复制后 .env 文件,您可以验证 .env.testing 通过将以下内容添加到您的测试中来加载 tests/Feature 文件夹。测试在 tests/Unit 文件夹不会引导 Laravel 框架:

/**
 * A basic test example.
 */
public function test_the_application_returns_a_successful_response(): void
{
    logger('Which environment file is Laravel using?', [
        'file' => $this->app->environmentFile()
    ]);
    
    $response = $this->get('/');

    $response->assertStatus(200);
}

当我跑步时 phpunit ,我收到以下日志,确认我正在使用 .env.testing 文件:

[2024-05-24 00:22:42] testing.DEBUG: Which environment file is Laravel using? {"file":".env.testing"} 

如果您在 VCS 中忽略此文件,您可以添加一个示例文件 .env.testing.example 符合您团队的惯例,或者让他们决定如何在本地配置测试。我建议在 CI 中设置系统级环境变量来配置测试数据库等内容。

查看 Laravel 文档 有关环境配置的更多详细信息。如果您好奇它在框架级别是如何工作的,请查看 设置环境文件路径 方法和 检查特定环境文件 在 Laravel 框架源代码中。


帖子 使用附加环境文件配置 Laravel 首先出现在 Laravel 新闻

加入 Laravel 时事通讯 直接在您的收件箱中获取所有此类最新的 Laravel 文章。