laravel-feature, 在 Laravel 项目中,用于管理标记标记的简单包

分享于 

15分钟阅读

GitHub

  繁體 雙語
A simple package to manage feature flagging in a Laravel project.
  • 源代码名称:laravel-feature
  • 源代码网址:http://www.github.com/francescomalatesta/laravel-feature
  • laravel-feature源代码文档
  • laravel-feature源代码下载
  • Git URL:
    git://www.github.com/francescomalatesta/laravel-feature.git
    Git Clone代码到本地:
    git clone http://www.github.com/francescomalatesta/laravel-feature
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/francescomalatesta/laravel-feature
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    laravel功能

    Latest Stable VersionBuild StatusCode CoverageScrutinizer Code QualityStyleCI

    laravel功能是一个完全专注于在你的应用程序中切换功能的软件包,以最简单的方式。 对 Laravel 来说当然。

    它是由 AdEspresso特性标志包( ) 激发的。

    特性?

    功能切换基本上是对应用程序中激活功能的完全控制的一种方法。

    让我们举几个例子来给你一个想法:

    • 你刚刚完成了最新的功能,你想推动它,但营销团队希望你在第二时间部署它;
    • 新的杀手功能已经就绪,但是你希望只针对一组特定的用户启用它;

    使用laravel功能,你可以:

    • 轻松地在你的应用程序中定义新的特性;
    • 全局启用/禁用功能/禁用功能;
    • 为特定用户的启用/禁用功能,或者为你想要的

    有许多关于功能切换方面的知识: 看看这个伟大的文章,了解更多信息。 这是个非常好和有用的讲座。

    安装

    你可以使用Composer安装laravel功能。

    $ composer require francescomalatesta/laravel-feature

    之后,需要向配置文件添加

    ...LaravelFeatureProviderFeatureServiceProvider::class,...

    现在,你需要运行迁移,以添加表的laravel功能。

    $ php artisan migrate

    。你也可以 !

    外观

    如果需要,还可以将 facade 添加到 app.php 配置文件中的aliases array。

    ...'Feature'=>LaravelFeatureFacadeFeature::class,...

    如果你不喜欢 facade,你可以在任何你想要的地方加入 !

    配置文件

    默认情况下,你可以立即使用laravel功能。 但是,如果你想调整一些设置,可以免费使用发布配置文件

    $ php artisan vendor:publish --provider="LaravelFeatureProviderFeatureServiceProvider"

    基本用法

    可以通过两种方式使用功能: 在全球范围内为他们工作,或者专门为特定的实体

    全局启用/禁用的功能

    声明一个新特性

    假设你有一个新特性,你想一直隐藏到某个特定的时刻。 我们叫它"page_code_cleaner"。 让我们把它添加到我们的应用程序中:

    Feature::add('page_code_cleaner', false);

    很简单吧你可以想象第一个参数的是 feature feature。是我们指定用来定义特性的当前状态的布尔值。

    • true 代表的功能是为每个人启用了
    • 如果你的功能是隐藏的,没有人可以使用它/看它

    那就是。

    检查是否启用了功能

    现在,让我们来想象一下我们示例的一个更好的上下文。 我们建立一个CMS我们的"page_code_cleaner"是用来。 清除我们的HTML代码。假设我们有一个像这样的控制器。

    classCMSControllerextendsController {publicfunctiongetPage($pageSlug) {// here we are getting our page code from some service$content=PageService::getContentBySlug($pageSlug);// here we are showing our page codereturn view('layout.pages', compact('content')); }}

    现在我们要部署新服务,但是我们不希望让用户 available,因为营销团队要求我们在下周发布它。 LaravelFeature帮助我们:

    classCMSControllerextendsController {publicfunctiongetPage($pageSlug) {// here we are getting our page code from some service$content=PageService::getContentBySlug($pageSlug);// feature flagging here!if(Feature::isEnabled('page_code_cleaner')) {$content=PageCleanerService::clean($content); }// here we are showing our page codereturn view('layout.pages', compact('content')); }}

    现在,只有在启用"page_code_cleaner"功能时才会执行特定服务代码的收费。

    更改功能激活状态

    显然,使用 Feature 类我们可以轻松地切换功能激活状态。

    // release the feature!Feature::enable('page_code_cleaner');// hide the feature!Feature::disable('page_code_cleaner');
    删除特性

    即使不使用它,你也可以方便地删除一个特征

    Feature::remove('page_code_cleaner');

    警告:一定要确定你做了什么。 如果从系统中删除一个特性,则如果在代码库中检查已经删除的功能,则会遇到异常。

    处理视图

    我非常喜欢刀片指令,它们帮助我编写更优雅的代码。 我准备了自定义刀片指令,@feature:

    <div>Thisisanexampletemplatediv.Alwaysvisible.</div>@feature('my_awesome_feature')<p>Thisparagraphwillbevisibleonlyif"my_awesome_feature"isenabled!</p>@endfeature<div>Thisisanotherexampletemplatediv.Alwaysvisibletoo.</div>

    一个很好的捷径 !

    启用/禁用特定用户/实体的功能

    即使以前看到的东西很有用,LaravelFeature收费也不只是按下功能上的开/关按钮。 有时,业务必需品需要更灵活的。 考虑一个 发行: 我们希望只向特定用户展示一个特性。 或者,也许只是一个测试员。

    为特定用户启用功能管理

    LaravelFeature使这成为可能,而且也更容易为我们的类增加一个特性。

    事实上,你所需要做的就是:

    • 将 trait 添加到 User 类中,
    • 让相同的类实现接口;
    ...classUserextendsAuthenticatableimplementsFeaturableInterface{useNotifiable, Featurable;...

    没什么了LaravelFeature现在已经知道了。

    状态优先级

    注意:请记住,现在你要阅读的所有内容都是无效的,如果一个功能已经在全局上启用。 要激活特定用户的特性,首先需要禁用它。

    如果功能在全球范围内启用,那么laravel功能首先是 ,然后在实体级别上。

    启用/禁用特定用户的功能
    $user=Auth::user();// now, the feature"my.feature" is enabled ONLY for $user!Feature::enableFor('my.feature', $user);// now, the feature"my.feature" is disabled for $user!Feature::disableFor('my.feature', $user);
    如果某个特定用户已经启用某个功能,请检查
    $user=Auth::user();if(Feature::isEnabledFor('my.feature', $user)) {// do amazing things!}
    其他便笺

    现在,LaravelFeature没有刀片指令来检查某个特定用户是否启用了某个功能。 但是,你仍然可以使用

    @if(Feature::isEnabledFor('my.feature', $user))// do $user related things here!@endif

    没有任何问题然而,的新开发进行中。)

    advance

    好了,我们有了基础,让我们来吧 !

    为其他实体启用功能管理

    就像我之前所说的,只需使用 Featurable 特性并在用户模型中实现 FeaturableInterface,就可以轻松为用户添加特性管理。 然而,在构造关系时,我决定实现一个代价为的many-to-many多态关系。 这意味着你可以给任何模型添加feature特性管理 !

    假设你有一个模型用来实现用户的基本角色系统。 这是因为你有管理员和普通用户。

    你推出了惊人的杀手功能但是你想只为管理员启用。 怎么做轻松。 概述:

    • Featurable 特性添加到 Role 模型中;
    • 确保 Role 模型实现了 FeaturableInterface

    让我们把角色用户关系看作one-to-many一个。

    你可能在 User 类上有一个 role() 方法,对? 很好你已经知道其他的了

    // $role is the admin role!$role=Auth::user()->role;...Feature::enableFor('my.feature', $role);...if(Feature::isEnabledFor('my.feature', $role)) {// this code will be executed only if the user is an admin!}

    用于功能的扫描目录

    当我制作这个包时,这个包的好处之一就是能够对"扫描"视图收费,在系统上没有已经存在的情况下,可以找到 @feature declarations,然后添加这些扫描的功能。

    我创建了一个简单的artisan命令来做这个。

    $ php artisan feature:scan

    命令将使用专门的服务来收取 resources/views 文件夹的并扫描每个刀片视图以查找 @feature 指令。 然后它将输出搜索结果。

    试试吧,你会喜欢的 !

    注意:如果已经发布了配置文件,那么你将能够对已经扫描目录的列表进行收费。

    使用自定义功能库

    想象一下,你想用来改变你商店的功能或者方式。 出于某些原因,你想要将它的存储在 static 文件或者Dropbox上。

    Eloquent没有Dropbox驱动程序,所以你不能使用这个软件包。 磅。

    只是玩笑当开发人员不想使用这个软件时,我希望能够创建一个完全可以重用的逻辑。

    为此,我为作业创建了一个良好的接口,并在 Laravel 服务容器中创建了一些绑定。 没有什么是真正复杂的。

    我讨论的接口是 FeatureRepositoryInterface

    <?phpnamespaceLaravelFeatureDomainRepository;useLaravelFeatureDomainModelFeature;useLaravelFeatureFeaturableFeaturableInterface;interfaceFeatureRepositoryInterface{publicfunctionsave(Feature$feature);publicfunctionremove(Feature$feature);publicfunctionfindByName($featureName);publicfunctionenableFor($featureName, FeaturableInterface$featurable);publicfunctiondisableFor($featureName, FeaturableInterface$featurable);publicfunctionisEnabledFor($featureName, FeaturableInterface$featurable);}

    这里接口有一些方法。 让我们快速解释一下:

    • 保存:如果不存在,该方法用于在系统上保存一个新的特征;
    • 删除:这里方法用于从系统中删除一个特性;
    • 这里方法用于从系统中找到一个特性,给出它的名称;
    • 为特定的Featurable 实体启用一个功能,以为代价
    • 为特定的Featurable 实体禁用一个功能的 disableFor:
    • 为一个特定的Featurable 实体启用一个用于检查一个特性是否已经启用的收费:

    因此,你需要为实现一个实现 FeatureRepositoryInterface的新 DropboxFeatureRepository 创建 ,所有你刚才看到的方法都是。

    最后,你必须在 features.php 配置 file: 中更改存储库绑定

    'repository'=>LaravelFeatureRepositoryEloquentFeatureRepository::class

    将成为。

    'repository'=>MyWonderfulDropboxFeatureRepository::class

    完成顺便说一下,不要忘记让你需要的实体实现 FeaturableInterface

    <?phpnamespaceLaravelFeatureFeaturable;interfaceFeaturableInterface{publicfunctionhasFeature($featureName);}

    唯一的方法是 hasFeature。 用于定义是否为该实体启用了给定特性,或者。

    为了更好地理解机制,可以随意查看 EloquentFeatureRepository 类和我构建的Featurable 特性。

    更改日志

    有关最近发生更改的更多信息,请参见变更日志

    测试

    你可以使用以下方法启动测试:

    $ phpunit

    或者,

    $ composer test

    有两个独立的测试套件:

    • 单位;
    • 集成;
    $ phpunit --testsuite=unit
    $ phpunit --testsuite=integration

    请参见 contribute进行详细信息。

    安全性

    如果发现任何相关的安全问题,请电子邮件 francescomalatesta@live.it,而不是使用问题跟踪程序。

    Credits

    许可证

    MIT许可证( MIT ) 有关详细信息,请参阅许可证文件


    MAN  proj  PAC  PACK  FLA  feature  
    相关文章