friendsofcat / laravel-feature-flag
Laravel 特性开关
Requires
- php: ^7.3|^8.0
Requires (Dev)
- doctrine/dbal: ^2.6|^3.0
- illuminate/support: ^8.50.0
- laravel/legacy-factories: ^1.1
- mockery/mockery: ^1.4.2
- orchestra/testbench: ^6.19.0
- permafrost-dev/coverage-check: ^1.1
- phpunit/phpunit: ^7.0|^9.3.3
- ramsey/uuid: ^3.0|^4.0
- squizlabs/php_codesniffer: ^3.6
- 4.2.2
- 4.2.1
- v4.2.0
- v4.1.2
- v4.1.1
- v4.1.0
- v4.0.0
- v3.x-dev
- 3.2.0
- v3.1.10
- v3.1.9
- v3.1.8
- v3.1.7
- v3.1.6
- v3.1.5
- v3.1.4
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- dev-master / 3.0.x-dev
- v3.0.0
- v2.1.1
- v2.1.0
- v2.0.2
- v2.0.1
- v2.0.0
- v1.0.1
- v1.0.0
- dev-fix-variants
- dev-invalid-json-handling
- dev-use-team-name
- dev-add-variant-to-form
- dev-team-based-flags
- dev-php_8
- dev-feature/dry-out-queries
- dev-feature_meta_data
- dev-fix_format_issue
This package is auto-updated.
Last update: 2024-08-29 23:16:28 UTC
README
概述
您可以在这里找到关于这个库的全面博客文章。这个项目仍在开发中。
我们正在努力在应用程序中使用特性开关或切换。首先,我们希望始终在主线分支上工作,因此这将是一个关键的编码纪律,使用特性开关可以隐藏正在开发的功能,知道它不会与应用程序冲突。例如,如果热修复或另一个功能准备就绪,可以将其推送到生产,而不用担心正在开发的功能。
在核心中,我们使用这个库Atriedes/feature,因为它具有考虑常见特性开关状态所需的逻辑,例如用户、用户组、开、关、组、管理员、内部、随机等。然而,我们也在其中混合了一些不错的 Laravel 授权 特性,因此您可以做一些事情,比如
在 blade 模板中
@can('feature-flag', 'add-twitter-field') <!-- code here --> @endcan
或者在 PHP 中
if (Gate::allows('feature-flag', 'awesome-feature')) { <!-- code here --> }
if (Gate::denies('feature-flag', 'awesome-feature')) { <!-- code here --> }
如果您需要将特性开关传递给前端 JS 框架(如 Angular 或 Vue.js),您可以通过使用 FeatureFlagsForJavascript::get() 静态方法来实现。
这使用了这个库https://github.com/laracasts/PHP-Vars-To-Js-Transformer 来将这些信息放入 windows
对象中,对于 Angular,$window
现在可以访问它了
JavaScript::Put(
[
'pusher_public_key' => env('PUSHER_PUBLIC'),
'feature_flags' => FeatureFlagsForJavascript::get()
]
);
安装
使用 composer 安装包
composer require "friendsofcat/laravel-feature-flag"
将以下内容添加到您的 config/app.php 提供者数组中
FriendsOfCat\LaravelFeatureFlags\FeatureFlagsProvider::class,
发布包迁移
php artisan vendor:publish --provider="FriendsOfCat\LaravelFeatureFlags\FeatureFlagsProvider" --tag='migrations'
然后运行迁移以设置基本表
php artisan migrate
此包创建了许多路由。它们可以通过发布视图来覆盖
php artisan vendor:publish --provider="FriendsOfCat\LaravelFeatureFlags\FeatureFlagsProvider" --tag='views'
然后,将文件放置在 resources/vendors/laravel-feature-flags
中。请注意,视图 @extends('layouts.default')
,因此如果您的布局不同,您将需要调整发布的视图文件。
接下来,发布配置
php artisan vendor:publish --provider="FriendsOfCat\LaravelFeatureFlags\FeatureFlagsProvider" --tag='config'
重要:默认情况下,路由由 'auth' 中间件投影,但您应该检查您的安装以确保权限可接受。中间件设置可在 'config/laravel-feature-flag.php' 文件中进行配置。
确保也为布局设置 default_view
。
config/laravel-feature-flag.php
您的 .env 文件
LARAVEL_FEATURE_FLAG_VIEW="layouts.default"
使用
访问 /admin/feature_flags
通过 UI 管理功能。
检查特性开关是否存在
为此,您可以使用 exists() 方法
if(\FriendsOfCat\LaravelFeatureFlags\Feature::exists('see-twitter-field'))
{
//do something
}
为用户角色启用
您可以通过在配置表单中使用 roles 变体来为特定用户角色启用特性开关
例如
{ "roles": ["admin", "dev"]}
如果您在用户模型中没有 roles 属性,您只需要实现 FeatureFlagsEnabler 接口并使用 FeatureFlagUserRoleTrait
use FriendsOfCat\LaravelFeatureFlags\FeatureFlagsEnabler;
use FriendsOfCat\LaravelFeatureFlags\FeatureFlagUserRoleTrait;
class User extends Authenticatable implements FeatureFlagsUserRoles
{
use AuthenticableTrait, FeatureFlagUserRoleTrait;
}
为用户团队启用
您可以通过在配置表单中使用 teams 变体来为特定用户团队启用特性开关
例如
{ "teams": ["Team 1", "Team 2"]}
如果您在用户模型中没有 teams 属性,您只需要实现 FeatureFlagsEnabler 接口并使用 FeatureFlagUserRoleTrait
use FriendsOfCat\LaravelFeatureFlags\FeatureFlagsEnabler;
use FriendsOfCat\LaravelFeatureFlags\FeatureFlagUserRoleTrait;
class User extends Authenticatable implements FeatureFlagsUserRoles
{
use AuthenticableTrait, FeatureFlagUserRoleTrait;
}
非认证使用
有时您不是在 Auth 用户级别使用它,对于大多数我们的用例来说,这很少见,但对于非认证情况,您可以直接使用这个
if(\FriendsOfCat\LaravelFeatureFlags\Feature::isEnabled('see-twitter-field'))
{
//do something
}
请记住,您需要将此内容放入数据库中,因此它是开启或关闭的。您可能没有用户界面,这可能是一个例如微服务的例子,因此只需将状态迁移到数据库中即可。
$feature = new FeatureFlag();
$feature->key = "see-twitter-field";
$feature->variants = "on"; //or "off"
$feature->save();
现在,当FeatureFlag Provider实例化时,它将此设置为“世界”状态,您可以通过isEnabled "on"为true和"off"为false来访问它。
同步开关
可以使用提供的feature-flag:sync
命令同步功能标志。这将同步在laravel-feature-flag.php
配置文件中定义的sync_flags
配置中的标志。此标志配置的格式为"key => 默认值"。默认情况下,任何被删除的标志都将从存储中删除。有一个--skip-cleanup
标志可以跳过此步骤。
演示/示例
如果您想尝试演示/示例,也请在您的config/app.php提供者数组中包含以下内容:
FriendsOfCat\LaravelFeatureFlags\ExampleFeatureProvider::class
然后运行
php artisan vendor:publish --provider="FriendsOfCat\LaravelFeatureFlags\ExampleFeatureProvider" --tag='migrations'
php artisan migrate
它有一个回滚功能,可以帮助清理。
有一个名为/admin/feature_flags/example
的虚拟路由,您可以访问它,它将显示它未开启。但如果你然后转到管理员UI /admin/feature_flags
,您可以切换它开启或关闭。
测试
有一个设置页面,我对该包安装后可以运行的Laravel测试做了一些。
如果您试图测试在工作中的使用,您可以在测试类中使用辅助特质。
use DatabaseTransactions, \FriendsOfCat\LaravelFeatureFlags\FeatureFlagHelper;
然后从那里工厂出您的添加和状态,然后重新注册世界。
/** * @test */ public function should_fail_validation_since_twitter_missing() { //Make a form request //Set validation on that related to twitter field //make sure the feature flag is on $user_id = Rhumsaa\Uuid\Uuid::uuid4()->toString(); $user = factory(\App\User::class)->create([ 'id' => $user_id, 'is_admin' => 1 ]); $this->actingAs($user); factory(\FriendsOfCat\LaravelFeatureFlags\FeatureFlag::class)->create( [ 'key' => 'add-twitter-field', 'variants' => 'on' ] ); $this->registerFeatureFlags(); //// }
待办事项
- 使用模型事件来完成这项工作
- 功能标志设置的缓存和更改时更新缓存
- 显示如何在菜单和其他区域中工作,例如包含和提供者