allysonsilva/laravel-multienv

此包允许您在多租户环境中使用多个 .env 文件

v2.1.0 2022-10-10 03:44 UTC

This package is auto-updated.

Last update: 2024-09-14 09:27:43 UTC


README

Social Card of Laravel Multi ENVs

PHP Version Laravel Version CI Status PHPCS - GitHub Workflow Status PHPMD - GitHub Workflow Status PHPStan - GitHub Workflow Status Coverage Status Latest Version MIT Licensed

使用多个 `.env` 文件,并为这些不同 .env 文件中的环境变量设置优先级链。通过域名(多租户)以自定义方式使用 .env 文件来操作环境变量。

🚀 安装

需求

此包已开发并测试,以与以下最低要求一起使用

  • PHP 8.0
  • Laravel 9.0

Laravel 版本兼容性

安装包

您可以通过 Composer 安装此包

composer require allysonsilva/laravel-multienv

发布配置

然后,您可以使用以下命令发布包的配置文件

php artisan vendor:publish --tag="envs-config"

🔧 配置

  1. 将特质添加到 kernel console app/Console/Kernel.php

    <?php
    
    namespace App\Console;
    
    use Illuminate\Console\Scheduling\Schedule;
    +use Allyson\MultiEnv\Concerns\ConsoleCallTrait;
    +use Allyson\MultiEnv\Concerns\BootstrappersTrait;
    use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
    
    class Kernel extends ConsoleKernel
    {
    +    use BootstrappersTrait, ConsoleCallTrait;
  2. 将特质添加到 kernel http app/Http/Kernel.php

    <?php
    
    namespace App\Http;
    
    +use Allyson\MultiEnv\Concerns\BootstrappersTrait;
    use Illuminate\Foundation\Http\Kernel as HttpKernel;
    
    class Kernel extends HttpKernel
    {
    +    use BootstrappersTrait;

📖 使用方法

通过操作项目的 .envs 文件来使用此包。

项目根目录 中使用多个 .env 文件

  • 您可以像喜欢的那样使用尽可能多的 .env 文件。

  • 默认情况下,当列出 .env 文件以给予优先级时,使用“自然顺序”算法,更具体地说,是 PHP 的 strnatcmp 函数,因此最后列出的 .envs 中的环境变量将具有优先级/优先级高于所有其他环境变量。

    • 您可以使用 config('envs.sorted') 来自定义排序 .envs 文件。 数组的最后一个项目将具有比其他项目更高的优先级。
  • 使用 config('envs.ignored') 正则表达式来忽略不应处理/处理的 .env 文件。

查看实际效果

假设我们在应用程序根目录中有 3 个 .env 文件,其 环境变量 设置如下

.
├── app
├── bootstrap
├── config
├── database
├── envs
│   ├── .env.site1.test
│   └── .env.site2.test
├── lang
├── public
├── resources
├── routes
├── storage
├── tests
├── .env
├── .env.example
+├── .envA
+├── .envB
+├── .envC
├── .gitattributes
├── .gitignore
├── README.md
├── artisan
├── composer.json
└── phpunit.xml

注意:以下应用程序结构中的 envs 文件夹将在稍后解释。

每个 .env 文件都按如下方式设置其环境变量

.envA:

ENV_NAME="NAME Env A"
APP_URL=http://env-a.test

ENV_FILE_A=.envA

.envB:

ENV_NAME="NAME Env B"
APP_URL=http://env-b.test

ENV_FILE_B=.envB

.envC:

ENV_NAME="NAME Env C"
APP_URL=http://env-c.test

ENV_FILE_C=.envC

目前,.envC 文件在上面的结构中是最后一个列出的,因此它将覆盖先前的 .env 文件中定义的任何 环境变量,以及存在于其他文件中的环境变量。更多不在最后(优先级)的,将正常使用,三个文件的环境变量结果/合并如下

ENV_NAME="NAME Env C"
APP_URL=http://env-c.test

ENV_FILE_A=.envA
ENV_FILE_B=.envB
ENV_FILE_C=.envC

使用 config('envs.sorted') 的配置来自定义文件优先级的默认顺序

'sorted' => [
    '.envA',
    '.envC',
    '.envB',
],

如上所述,3 个文件的环境变量结果将是

ENV_NAME="NAME Env B"
APP_URL=http://env-b.test

ENV_FILE_A=.envA
ENV_FILE_C=.envC
ENV_FILE_B=.envB

在每个 域名 中使用多个 .env 文件

与在应用程序根目录中使用多个 envs 文件 的方式相同,也可以按域名使用 .env 文件

  • 这些文件位于 config('envs.folder') 的配置文件夹中,默认文件夹名称为 envs,如上所述的项目列表中所示。

  • 为了使 .env 文件与域名/子域名匹配,必须创建如下所示:.env.<domain>

  • 要配置不同于默认的 .env 文件名,请将域名添加到 config('envs.domains') 中,并将域名的 env 键设置为您的偏好。

查看实际效果

使用与上一个示例相同的结构,如果请求 / 域名为 site1.test,并且 envs 文件夹中有一个 .env.site1.test 文件,则该文件中的 环境变量 将覆盖所有其他 环境变量

假设 .env.site1.test 文件具有以下变量

ENV_NAME="NAME Env SITE 1"
APP_URL=http://site1.test

当在项目中使用 环境变量 时,它们将产生以下结果

ENV_NAME="NAME Env SITE 1"
APP_URL=http://site1.test

ENV_FILE_A=.envA
ENV_FILE_C=.envC
ENV_FILE_B=.envB

要查看示例的实际效果,让我们使用 这个laravel应用

域名自定义 .env 文件名

当域名的 .env 文件名与默认值(即:.env.<domain>)不同时,请按照以下方式在 config('envs.domains') 中的域名配置中设置 env

'domains' => [
    'your-domain.tld' => [
        'env' => '.env.custom-name',
    ],
],

按域名使用 config:cacheroute:cache

您可以按域名缓存配置和路由。

按域名缓存 配置 - config:cache

命令中现在有一个新的 --domain 选项。使用此选项,将覆盖并优先考虑所有其他环境变量,使用来自 envs 文件夹中域名 .env 文件中的环境变量。

使用 config('envs.domains') 配置来自定义将保存并用作配置缓存的 .php 文件。这确保了同一项目中可以存在并使用多个域配置文件。

要生成并使用具有自定义域名缓存设置名称的 .php 文件,请使用以下代码作为示例

'domains' => [
    'site2.test' => [
        'APP_CONFIG_CACHE' => 'config-site2-test.php',
    ],
],

按域名缓存 路由 - route:cache

如上所述,创建路由缓存文件的命令有一个新的 --domain 选项,该选项将用于根据选项值过滤只有具有域名的路由。

也可以为路由缓存文件指定自定义名称,例如,配置缓存是通过 APP_ROUTES_CACHE 键,如下例所示

'domains' => [
    'site2.test' => [
        'APP_ROUTES_CACHE' => 'routes-v7-site2-test.php',
    ],
],

🧪 测试

composer test:unit

📝 更新日志

请参阅 更新日志 了解有关此包更改的更多信息。

🤝 贡献

请参阅 贡献指南 获取详细信息。

🔒 安全性

如果您发现任何与安全性相关的问题,请通过电子邮件 github@allyson.dev 反馈,而不是使用问题跟踪器。

🏆 致谢

许可

MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件