使用额外环境文件配置 Laravel
最后更新于 作者: Paul Redmond
在 Laravel 中,您可以配置额外的环境文件,这些文件将在 .env
文件加载之前加载。此功能对于测试很有用,您可以在测试环境中加载 .env.testing
环境文件而不是默认文件。通常您不需要使用此功能,但值得知道的是,通过设置 APP_ENV
环境变量,Laravel 可以检测自定义配置。
CLI 示例
此功能最简单的例子是使用不同的环境文件在运行 Laravel Artisan 控制台或甚至 phpunit
CLI 时。
使用 Artisan 命令,您也可以使用不同的 .env
文件,方法是使用 --env
标志或定义 APP_ENV
。例如,运行以下命令,Laravel 将会查找 .env.demo
# Set up `.env.demo`cp .env .env.demoecho "\nEXAMPLE_SETTING=demo" >> .env.demo # Use the `demo` env php artisan tinker --env=demo # Or set APP_ENVAPP_ENV=demo php artisan tinker
如果找到,Laravel 将不会加载 .env
文件,而是加载 .env.demo
.env.testing
在 PHPUnit 测试中使用 基于我们对 Laravel 框架在存在特定 ENV 文件时加载它的了解,在 PHPUnit 中运行 Laravel 功能测试默认情况下会使用 .env
文件。在测试和本地开发中使用 .env
会很快导致问题,例如为测试配置单独的数据库。您可以在 phpunit.xml
中定义数据库连接详细信息,但让我们也看一下在 .env.testing
中设置它们。
PHPUnit 在 phpunit.xml
中定义了一个 APP_ENV
环境变量,这意味着 Laravel 在引导功能测试时会查找 .env.testing
文件,因为 phpunit.xml
文件在 Laravel 框架在功能测试中启动之前定义了 APP_ENV
。
<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
文件后,您可以在 tests/Feature
文件夹中的测试中添加以下内容来验证是否加载了 .env.testing
。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 文档 以获取有关环境配置的更多详细信息。如果您对如何在框架级别实现这一点感到好奇,请查看 setEnvironmentFilePath 方法和 checkForSpecificEnvironmentFile 在 Laravel 框架源代码中。