philspil66 / gatekeeper
一个用于在 Laravel 项目中管理功能标志的软件包。
Requires
- php: ^7.1
- illuminate/database: ^5.8|^6.0|^7.0|^8.0
- illuminate/support: ^5.6|^6.0|^7.0|^8.0
Requires (Dev)
- mockery/mockery: ^0.9.4
- orchestra/database: ^3.6
- orchestra/testbench: ~3.6
- phpunit/phpunit: ~7.0
- squizlabs/php_codesniffer: ^2.3
This package is auto-updated.
Last update: 2024-09-20 19:50:38 UTC
README
Gatekeeper 是一个用于在 Laravel 项目中管理功能标志的软件包。
什么是功能标志?
功能标志基本上是一种在您的应用程序中完全控制功能激活的方法。
让我们举几个例子来给您一个概念
- 你刚刚完成了一个新功能的开发,你想部署它,但市场营销团队希望你在第二时刻部署它;
- 新的杀手级功能准备好了,但你想只为特定用户集启用它;
使用 Gatekeeper,你可以
- 轻松地在应用程序中定义新功能;
- 全局启用/禁用功能;
- 为特定用户或任何你想的东西启用/禁用功能;
关于功能切换有很多东西要了解:查看 这篇优秀的文章 了解更多信息。这是一篇非常棒且实用的讲座。
兼容性
Gatekeeper 与 PHP 5.6 或更高版本兼容。
安装
您可以使用 Composer 安装 Gatekeeper。
$ composer require philspil66/gatekeeper
之后,您需要在 app.php
配置文件中添加 FeatureServiceProvider
。
... Gatekeeper\Provider\FeatureServiceProvider::class, ...
现在您必须运行迁移,添加 Gatekeeper 需要的表。
$ php artisan migrate
... 现在您已经准备好了!
外观
如果您愿意,您还可以在 app.php
配置文件中的 aliases
数组中添加 Feature
外观。
... 'Feature' => \Gatekeeper\Facade\Feature::class, ...
如果您不喜欢外观,您可以在任何需要的地方注入 FeatureManager
类!
配置文件
默认情况下,您可以直接使用 Gatekeeper。但是,如果您想调整一些设置,请随时使用以下方法 发布配置文件。
$ php artisan vendor:publish --provider="Gatekeeper\Provider\FeatureServiceProvider"
基本用法
您可以使用两种方式使用功能:全局使用或为特定实体具体使用。
全局启用/禁用功能
声明一个新功能
假设您有一个新的功能,您想将其隐藏到某个时刻。我们将它称为 "new_super_feature"。让我们将其添加到我们的应用程序中。
Gatekeeper::add('new_super_feature', false);
很简单,对吧?如您所想,第一个参数是功能名称。第二个是我们指定的布尔值,以定义功能的当前状态。
true
表示 功能对所有人均已启用;false
表示 功能被隐藏,没有人可以使用它/看到它;
就是这样。
检查功能是否启用
现在,让我们想象一个更好的例子。我们正在构建一个 CMS,我们的 "new_super_feature" 用于... 清理我们的 HTML 代码。假设我们有一个这样的控制器。
class CMSController extends Controller { public function getPage($pageSlug) { // here we are getting our page code from some service $content = PageService::getContentBySlug($pageSlug); // here we are showing our page code return view('layout.pages', compact('content')); } }
现在,我们想要部署新的服务,但我们不希望用户可以使用它,因为市场营销团队要求我们下周发布。Gatekeeper 帮助我们做到这一点。
class CMSController extends Controller { public function getPage($pageSlug) { // here we are getting our page code from some service $content = PageService::getContentBySlug($pageSlug); // feature flagging here! if(Gatekeeper::isEnabled('new_super_feature')) { $content = PageCleanerService::clean($content); } // here we are showing our page code return view('layout.pages', compact('content')); } }
现在,只有当 "new_super_feature" 功能启用时,特定的服务代码才会执行。
更改功能激活状态
显然,使用 Feature
类,我们可以轻松地切换功能激活状态。
// release the feature! Gatekeeper::enable('new_super_feature'); // hide the feature! Gatekeeper::disable('new_super_feature');
删除功能
即使不常使用,您也可以轻松地使用以下方法 删除功能。
Gatekeeper::remove('new_super_feature');
警告:请确保您所做的事情。如果您从系统中删除功能,代码库中仍存在删除功能的检查时,您可能会遇到异常。
与视图一起工作
我真的很喜欢blade指令,它们帮助我编写更优雅的代码。我准备了一个自定义的blade指令,@feature
<div>This is an example template div. Always visible.</div> @feature('my_awesome_feature') <p>This paragraph will be visible only if "my_awesome_feature" is enabled!</p> @endfeature <div>This is another example template div. Always visible too.</div>
一个真正方便的快捷方式!
为特定用户/实体启用/禁用功能
即使我们之前看到的东西很有用,Gatekeeper 不仅仅是关于在功能上推送开/关按钮。有时,业务需求需要更多的灵活性。也许我们只想向特定用户推出一个功能。或者,也许只是为了一个测试用户。
为特定用户启用功能管理
Gatekeeper使这成为可能,并且与将特性添加到我们的User
类一样简单。
事实上,您需要做的只是
- 将
Gatekeeper\Featurable\Featurable
特性添加到User
类; - 让同一个类 实现
FeaturableInterface
接口;
... class User extends Authenticatable implements FeaturableInterface { use Notifiable, Featurable; ...
就这么多!Gatekeeper现在已经知道该做什么了。
状态优先级
请注意,以下所有内容在功能已在全球范围内启用的情况下均不适用。要为特定用户激活功能,您首先需要禁用它。
Gatekeeper 首先检查功能是否已在全球范围内启用,然后转到实体级别。
为特定用户启用/禁用功能
$user = Auth::user(); // now, the feature "my.feature" is enabled ONLY for $user! Gatekeeper::enableFor('my.feature', $user); // now, the feature "my.feature" is disabled for $user! Gatekeeper::disableFor('my.feature', $user);
检查特定用户是否启用了功能
$user = Auth::user(); if(Gatekeeper::isEnabledFor('my.feature', $user)) { // do amazing things! }
Artisan命令
您可以运行以下命令来添加或删除功能。
php artisan gatekeeper:add my-feature php artisan gatekeeper:remove my-feature
您可以运行以下命令来切换功能的开启或关闭状态。
php artisan gatekeeper:enable my-feature php artisan gatekeeper:disable my-feature
其他注意事项
Gatekeeper还提供了一个blade指令来检查特定用户是否启用了功能。您可以使用@featurefor
blade标签
@featurefor('my.feature', $user) // do $user related things here! @endfeaturefor
高级功能
好的,现在我们已经了解了基础知识,让我们提高标准!
为其他实体启用功能管理
正如我之前所说,您只需使用Featurable
特性和在User模型中实现FeaturableInterface
,就可以轻松地为用户添加功能管理。然而,在构建关系时,我决定实现一个多对多多态关系。这意味着您可以 将功能管理添加到任何模型!
让我们举个例子:想象一下您有一个Role
模型,您用它来实现用户的基本角色系统。这是因为您有管理员和普通用户。
因此,您推出了惊人的杀手级功能,但只想为管理员启用它。怎么做?很简单。回顾
- 将
Featurable
特性和Role
模型; - 确保
Role
模型实现了FeaturableInterface
;
让我们将角色-用户关系视为一对一关系。
您在User
类上可能有一个role()
方法,对吗?很好。您已经知道了剩下的部分
// $role is the admin role! $role = Auth::user()->role; ... Gatekeeper::enableFor('my.feature', $role); ... if(Gatekeeper::isEnabledFor('my.feature', $role)) { // this code will be executed only if the user is an admin! }
变更日志
有关最近更改的更多信息,请参阅变更日志。
鸣谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。