noistudio/laravel-multienv

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

2.x-dev 2024-02-19 13:59 UTC

This package is auto-updated.

Last update: 2024-09-19 15:14:22 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

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

🚀 安装

要求

此包已开发并测试,可满足以下最低要求

  • PHP 8.0
  • Laravel 9.0

Laravel 版本兼容性

安装包

您可以通过 Composer 安装此包

composer require noistudio/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

📝 变更日志

有关此包更改的更多信息,请参阅 CHANGELOG

🤝 贡献

有关详细信息,请参阅 CONTRIBUTING

🔒 安全

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

🏆 致谢

许可证

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