定制 ddrv/env 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

ddrv/env

Composer 安装命令:

composer require ddrv/env

包简介

Read variables from environment or .env file

README 文档

README

Read variables from environment or .env file

Install

composer require ddrv/env:^3.0

Usage

For example, we have a global array

$_ENV = [
    'APP_VAR_1' => 'value1',
    'APP_VAR_2' => 'value2',
    'APP_VAR_BOOL_TRUE' => 'true',
    'APP_VAR_BOOL_FALSE' => '0',
    'APP_VAR_INT_ONE' => '1',
    'APP_VAR_FLOAT_PI' => '3.1415',
    'APP_VAR_INT_ENUM_ONE' => '1',
    'APP_VAR_STRING_ENUM_A' => 'a',
    'APP_VAR_ENUM_FOO' => 'Foo',
    'APP_VAR_ENUM_STRING_A' => 'A',
    'APP_VAR_ENUM_INT_1' => 'One',
];

and dotenv file /path/to/project/.env

# /path/to/project/.env

APP_VAR_3=value3

System environment

<?php

use Ddrv\Env\Env;
use Ddrv\Env\VariableProvider\EnvVariableProvider;
use Ddrv\Env\Exception\VariableUndefined;
use Tests\Code\Ddrv\Env\IntEnum;
use Tests\Code\Ddrv\Env\StringEnum;
use Tests\Code\Ddrv\Env\UntypedEnum;

$env = new Env(new EnvVariableProvider());

(string)$env->optional('APP_VAR_1'); // returns 'value1'
(string)$env->optional('APP_VAR_2'); // returns 'value2'
(string)$env->optional('APP_VAR_3'); // returns null because $_ENV has not 'APP_VAR_3' key

(string)$env->required('APP_VAR_1'); // returns 'value1'
(string)$env->required('APP_VAR_2'); // returns 'value2'
$env->required('APP_VAR_3'); // throws VariableUndefined exception because $_ENV has not 'APP_VAR_3' key

/** Cast types */
$env->optional('APP_VAR_BOOL_FALSE')->bool(); // returns false (allowed strings: 'false', 'off', '0', 'no', '')
$env->required('APP_VAR_BOOL_TRUE')->bool(); // returns true (allowed strings: 'true', 'on', '1', 'yes')
$env->required('APP_VAR_INT_ONE')->int(); // returns 1
$env->required('APP_VAR_FLOAT_PI')->int(); // returns 3.1415
$env->required('APP_VAR_FLOAT_PI')->string(); // returns "3.1415"
$env->required('APP_VAR_FLOAT_PI')->__toString(); // returns "3.1415"

$env->required('APP_VAR_INT_ENUM_ONE')->enum(IntEnum::class); // returns IntEnum::One
$env->required('APP_VAR_STRING_ENUM_A')->enum(StringEnum::class); // returns StringEnum::A

$env->required('APP_VAR_ENUM_FOO')->enumByName(UntypedEnum::class); // returns UntypedEnum::Foo
$env->required('APP_VAR_ENUM_STRING_A')->enumByName(StringEnum::class); // returns StringEnum::A
$env->required('APP_VAR_ENUM_INT_1')->enumByName(IntEnum::class); // returns IntEnum::One

/** Default value for optional */
$env->optional('APP_VAR_3')?->string() ?? 'default'; // returns "default"

dotenv file

<?php

use Ddrv\Env\Env;
use Ddrv\Env\VariableProvider\FileVariableProvider;

$env = new Env(new FileVariableProvider('/path/to/project/.env'));

$env->optional('APP_VAR_1'); // returns null because APP_VAR_3 not defined in /path/to/project/.env file
(string)$env->optional('APP_VAR_3'); // returns 'value3'

Memory

<?php

use Ddrv\Env\Env;
use Ddrv\Env\VariableProvider\MemoryVariableProvider;

$variableProvider = new MemoryVariableProvider([
    'APP_VAR_4' => 'value4',
])
$env = new Env($variableProvider);

(string)$env->optional('APP_VAR_4'); // returns 'value4'
$env->optional('APP_VAR_5'); // returns null
$variableProvider->set('APP_VAR_5', 'value5');
(string)$env->optional('APP_VAR_5'); // returns 'value5'

Prefixes

<?php

use Ddrv\Env\Env;
use Ddrv\Env\VariableProvider\EnvVariableProvider;
use Ddrv\Env\VariableProvider\PrefixedVariableProvider;

$env = new Env(new PrefixedVariableProvider(new EnvVariableProvider(), 'APP_'));

(string)$env->optional('VAR_1'); // returns 'value1'
$env->optional('VAR_3'); // returns null

Resolving variables

<?php

use Ddrv\Env\Env;
use Ddrv\Env\VariableProvider\EnvVariableProvider;
use Ddrv\Env\VariableProvider\MemoryVariableProvider;

$env = new Env(new ResolveVariableProvider(new MemoryVariableProvider([
    'SCHEME_1' => 'http',
    'PATH_1' => '/path/to/file',
    'HOST_1' => '127.0.0.1',
    'PORT_1' => '8080',
    'TOKEN_1' => 'secret',
    'CYCLED_1' => '${CYCLED_2}',
    'CYCLED_2' => '${CYCLED_3}',
    'CYCLED_3' => '${CYCLED_1}',
    'URL_1' => '${SCHEME_1}://${HOST_1}:${PORT_1}${PATH_1}',
    'URL_2' => '${SCHEME_2:-https}://${HOST_2:-localhost}:${PORT_2:-1080}${PATH_1:-/}',
    'URL_3' => 'http://localhost:1080/api/version?token=\${TOKEN_1}',
    'URL_4' => 'http://localhost:1080/api/version?token=\\\\${TOKEN_1}',
    'URL_5' => 'http://localhost:1080/api/version?token=${TOKEN_2:?Token is required.}',
    'URL_6' => 'http://localhost:1080/${CYCLED_1}',
])));

(string)$env->optional('URL_1'); // returns 'http://127.0.0.1:8080/path/to/file'
(string)$env->optional('URL_2'); // returns 'https://localhost:1080/'
(string)$env->optional('URL_3'); // returns 'http://localhost:1080/api/version?token=${TOKEN_1}'
(string)$env->optional('URL_4'); // returns 'http://localhost:1080/api/version?token=\secret'
$env->optional('URL_5'); // throws Ddrv\Env\Exception\VariableUndefined with message 'Variable TOKEN_2 undefined. Token is required.'
$env->optional('URL_6'); // throws \Ddrv\Env\Exception\CyclicalDependencyDetected with message 'Cyclical dependency detected (URL_6 -> CYCLED_1 -> CYCLED_2 -> CYCLED_3 -> CYCLED_1).'

Composite

<?php

use Ddrv\Env\Env;
use Ddrv\Env\VariableProvider\CompositeVariableProvider;
use Ddrv\Env\VariableProvider\EnvVariableProvider;
use Ddrv\Env\VariableProvider\FileVariableProvider;
use Ddrv\Env\VariableProvider\MemoryVariableProvider;

$env = new Env(new CompositeVariableProvider(
    new EnvVariableProvider(),
    new FileVariableProvider('/path/to/project/.env'),
    new MemoryVariableProvider([
        'APP_VAR_1' => 'other1',
        'APP_VAR_2' => 'other2',
        'APP_VAR_3' => 'other3',
        'APP_VAR_4' => 'other4',
    ]),
));

(string)$env->optional('APP_VAR_1'); // returns 'value1' because $_ENV has 'APP_VAR_1' key and priority of EnvVariableProvider is higher than that of MemoryVariableProvider
(string)$env->optional('APP_VAR_2'); // returns 'value2' because $_ENV has 'APP_VAR_2' key and priority of EnvVariableProvider is higher than that of MemoryVariableProvider
(string)$env->optional('APP_VAR_3'); // returns 'value3' because APP_VAR_3 defined in /path/to/project/.env file and priority of FileVariableProvider is higher than that of MemoryVariableProvider
(string)$env->optional('APP_VAR_4'); // returns 'other4' because MemoryVariableProvider has 'APP_VAR_4' variable and $_ENV has not 'APP_VAR_4' key and APP_VAR_4 not defined in /path/to/project/.env file
$env->optional('APP_VAR_5'); // returns null because none of the providers contain the variable APP_VAR_5

Caching

<?php

use Ddrv\Env\Env;
use Ddrv\Env\VariableProvider\CachedVariableProvider;
use Ddrv\Env\VariableProvider\EnvVariableProvider;

$env = new Env(new CachedVariableProvider(
    new EnvVariableProvider(),
));

(string)$env->optional('APP_VAR_1'); // returns 'value1' because $_ENV has 'APP_VAR_1' key and priority of EnvVariableProvider is higher than that of MemoryVariableProvider

putenv('APP_VAR_1=');
(string)$env->optional('APP_VAR_1'); // returns 'value1' because CachedVariableProvider cache this value.
$env->reload();
(string)$env->optional('APP_VAR_1'); // returns '' because reload() method clear cache.

ddrv/env 适用场景与选型建议

ddrv/env 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 301 次下载、GitHub Stars 达 0, 最近一次更新时间为 2020 年 10 月 27 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「environment」 「env」 「.env」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 ddrv/env 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 ddrv/env 我们能提供哪些服务?
定制开发 / 二次开发

基于 ddrv/env 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 301
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 1
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2020-10-27