philspil66/gatekeeper

一个用于在 Laravel 项目中管理功能标志的软件包。

v1.2 2020-11-10 13:54 UTC

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)。有关更多信息,请参阅许可证文件