allysonsilva / laravel-multienv
此包允许您在多租户环境中使用多个 .env 文件
Requires
- php: >=8.0
- laravel/framework: ^9.32
Requires (Dev)
- ergebnis/phpstan-rules: ^1.0
- nunomaduro/larastan: ^2.2
- orchestra/testbench: ^7.0
- phpmd/phpmd: ^2.13
- phpstan/phpstan: ^1.8
- phpunit/phpunit: ^9.5
- slevomat/coding-standard: ^8.5
- squizlabs/php_codesniffer: ^3.7
- symplify/phpstan-rules: 10.1.2
README
使用多个 `.env` 文件,并为这些不同
.env
文件中的环境变量设置优先级链。通过域名(多租户)以自定义方式使用.env
文件来操作环境变量。
🚀 安装
需求
此包已开发并测试,以与以下最低要求一起使用
- PHP 8.0
- Laravel 9.0
Laravel 版本兼容性
安装包
您可以通过 Composer 安装此包
composer require allysonsilva/laravel-multienv
发布配置
然后,您可以使用以下命令发布包的配置文件
php artisan vendor:publish --tag="envs-config"
🔧 配置
-
将特质添加到 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;
-
将特质添加到 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:cache
和 route: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)。有关更多信息,请参阅 许可文件。