onix-systems-php / hyperf-feature-flags
特性标志扩展
Requires
- ext-redis: *
- hyperf/di: ^3.1
- hyperf/framework: ^3.1
- hyperf/redis: ^3.1
- nesbot/carbon: ^2.72
- onix-systems-php/hyperf-actions-log: ^1.2
- onix-systems-php/hyperf-core: ^1.2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.48
- mockery/mockery: ^1.6
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.5
- symfony/var-dumper: ^7.0
README
包含以下通用使用类
- 注解
- FeatureFlag;
- 方面
- FeatureFlagAspect;
- 常量
- Actions;
- DTO
- ResetFeatureFlagDTO;
- UpdateFeatureFlagDTO;
- 事件
- Action;
- 模型
- FeatureFlag;
- 仓库
- FeatureFlagRepository;
- 服务
- GetCurrentFeatureFlagService;
- GetFeatureFlagService;
- GetOverriddenFeatureFlagService;
- ResetFeatureFlagService;
- SetFeatureFlagService
- 其他
- RedisWrapper
安装
composer require onix-systems-php/hyperf-feature-flags
发布配置
php bin/hyperf.php vendor:publish onix-systems-php/hyperf-feature-flags
在配置中定义特性标志
格式:
'name' => 'rule'
config/autoload/feature-flags.php
return [ 'slack-integration' => true, 'my-custom-feature' => "[date:now] > '2024-02-06' && [date:now] <= '2024-12-31'", 'my-awesome-feature' => '[config:slack.integration] === true || [feature:my-custom-feature] === false', ];
注意! 如果您想使用日期,在您的规则中必须使用单引号括起来的日期。否则,规则将始终评估为 true。
基本用法
示例
- 通过:
OnixSystemsPHP\HyperfFeatureFlags\Annotations\FeatureFlag
。
#[FeatureFlag('slack-integration', false)] private function sendSlackNotification(string $link, Feedback $feedback): bool { //... }
从这段代码中我们可以看到,如果我们的 feature_flags
表或 redis 中的 slack-integrations
为 true,则将执行 sendSlackNotification
方法。在 FeatureFlag
方面的第二个参数设置为 false,则表示如果任何地方不存在 slack-integartion
,则默认方面将返回 false,此方法也将返回 false。
- 通过:
OnixSystemsPHP\HyperfFeatureFlags\Services\GetFeatureFlagService
。
此示例介绍了如何从您的控制器方法中使用它,该方法应返回 Psr\Http\Message\ResponseInterface
。这里我们不使用注解,因为我们需要返回的不是原始数据,而是一个对象。所以如果 $this->getFeatureFlagService->run('slack-integration')
返回 false,我们只需返回 $this->response->json([])
。否则,继续执行。
class SlackController { public function __construct(private \OnixSystemsPHP\HyperfFeatureFlags\Services\GetFeatureFlagService $getFeatureFlagService) {} public function webhook(): Psr\Http\Message\ResponseInterface { if (!$this->getFeatureFlagService->run('slack-integration')) { return $this->response->json([]) } } }
例如,我们在配置中有以下规则
return [ 'my-awesome-feature' => true, 'my-custom-feature' => "[date:now] > '2050-31-12' || [config:slack.integration] || [feature:my-awesome-feature]", ]
此规则的值是什么?
- 第一部分,将评估
[date:now] > '2050-31-12'
。显然,直到2050-31-12
它将是 false。 - 第二部分,将评估
[config:slack.integration]
。如果您的config/autoload/slack.php
文件中存在,它将获取integration
的值。假设我们的配置文件中没有slack-integration
,那么它将是null
。 - 第三部分,将评估
[feature:my-awesome-feature]
。没有什么特别之处,它将从我们的文件/config/autoload/feature_flags.php
中获取true
值。 - 最终,
my-custom-feature
规则的评估将是false || null || true
。评估结果将是true
。
类
OnixSystemsPHP\HyperfFeatureFlags\Services\SetFeatureFlagService
此类允许您将特性标志设置到 feature_flags
表中。方法 run()
接受一个参数:具有名称和规则特性的 UpdateFeatureFlagDTO
。它检查是否可以设置指定的特性标志。因此,您应该实现策略逻辑。
OnixSystemsPHP\HyperfFeatureFlags\Services\ResetFeatureFlagService
此类允许您重置您的功能。简单来说,它只是从数据库和Redis中删除您的标志。方法 run()
接受一个参数:具有名称和规则的功能标志的 ResetFeatureFlagDTO
。它会检查指定的用户是否有权重置此功能标志。因此,您应该实现策略逻辑。
OnixSystemsPHP\HyperfFeatureFlags\Services\GetCurrentFeatureFlagService
此类允许您获取所有当前功能标志。方法 run()
返回一个关联数组,包含功能标志的名称和基于规则的值。
OnixSystemsPHP\HyperfFeatureFlags\Services\GetOverriddenFeatureFlagsService
此类允许您获取所有被覆盖的功能。简单来说,它只是从数据库和Redis中获取您的标志。方法 run()
返回一个关联数组,包含功能标志的名称和值。
OnixSystemsPHP\HyperfFeatureFlags\Services\GetFeatureFlagService
此类允许您获取规则值。首先,它会去Redis检查是否存在,如果存在,则取出。其次,如果不存在,它会去数据库检查是否有同名标志,如果存在,则取出。最后,它会去配置文件,即使配置文件中存在该规则,它也会简单地返回 false
,在这些情况下,它会将值存储到Redis中。
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。