ryangjchandler / laravel-feature-flags
为Laravel提供有意见的feature flags包。
Requires
- php: ^8.1
- illuminate/contracts: ^9.0
- illuminate/database: ^9.0
- spatie/laravel-package-tools: ^1.9.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.8
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
- spatie/laravel-ray: ^1.26
README
此包提供了用于在您的Laravel应用程序中实现feature flags的意见化API。它支持应用程序级别的功能以及模型特定的feature flags。
安装
您可以通过Composer安装此包
composer require ryangjchandler/laravel-feature-flags
然后使用以下命令发布和运行迁移
php artisan vendor:publish --tag="feature-flags-migrations"
php artisan migrate
您可以使用以下命令发布配置文件
php artisan vendor:publish --tag="feature-flags-config"
用法
全局标志
要启用或禁用全局功能标志,分别使用Features::enable()
和Features::disable()
方法。
use RyanChandler\LaravelFeatureFlags\Facades\Features; Features::enable(name: 'registration'); Features::disable(name: 'registration');
要检查标志是否启用或禁用,分别使用Features::enabled()
和Features::disabled()
方法。
use RyanChandler\LaravelFeatureFlags\Facades\Features; if (Features::enabled(name: 'registration')) { // `registration` is enabled. } if (Features::disabled(name: 'registration')) { // `registration` is disabled. }
如果您只想创建新的标志而不更新现有的标志,即在一个seeder中,可以使用Features::add()
。
use RyanChandler\LaravelFeatureFlags\Facades\Features; Features::add('registration');
这将创建一个默认禁用的新标志。要默认启用标志,请向enabled
参数提供布尔值。
use RyanChandler\LaravelFeatureFlags\Facades\Features; Features::add('registration', enabled: true);
如果您只想切换标志,可以使用Features::toggle()
方法。
use RyanChandler\LaravelFeatureFlags\Facades\Features; Features::toggle(name: 'registration');
如果标志已启用,它将被禁用。如果已禁用,它将被启用。
要获取所有标志的数组,请使用Features::all()
方法。这将返回一个数组,其中标志名称用作键,表示标志当前状态的布尔值作为值。
use RyanChandler\LaravelFeatureFlags\Facades\Features; $flags = Features::all(); foreach ($flags as $name => $enabled) { // ... }
模型标志
如果您想为特定模型添加feature flags,请开始实现RyanChandler\LaravelFeatureFlags\Models\Contracts\HasFeatures
接口并使用RyanChandler\LaravelFeatureFlags\Models\Concerns\WithFeatures
trait。以下是一个在User
模型中的示例。
use RyanChandler\LaravelFeatureFlags\Models\Contracts\HasFeatures; use RyanChandler\LaravelFeatureFlags\Models\Concerns\WithFeatures; class User extends Authenticatable implements HasFeatures { use WithFeatures; }
该trait提供了一种符合接口的默认实现。建议您始终使用此实现,而不是编写自己的实现。
要启用、禁用或切换标志,请使用相同的Features::enable()
、Features::disable()
和Features::toggle()
方法,并提供带有for
名称参数的命名参数。
use RyanChandler\LaravelFeatureFlags\Facades\Features; $user = User::first(); Features::enable('registration', for: $user); Features::disable('registration', for: $user); Features::toggle('registration', for: $user);
WithFeatures
trait还为模型提供了一些辅助方法:enableFeature()
、disableFeature()
和toggleFeature()
。
Blade指令
此包还提供了一组条件Blade指令,用于使用feature flags保护您的视图。
@feature('registration') <a href="/register">Register now!</a> @endfeature
您还可以使用@elsefeature
和@unlessfeature
指令。
如果您想检查模型的feature flag,可以向指令提供命名参数。
return view('my-view', [ 'user' => User::first(), ]);
@feature('registration', for: $user) <a href="/register">Register now!</a> @endfeature
中间件
此包提供了一段中间件代码,用于使用feature flags保护您的路由。
您需要将以下代码添加到您的app/Http/Kernel.php
文件中。
protected $routeMiddleware = [ 'feature' => \RyanChandler\LaravelFeatureFlags\Middleware\HasFeature::class, ];
然后您可以在路由上注册中间件,如下所示
Route::get('/register', fn () => ...)->middleware('feature:registration');
中间件默认行为是使用403 Forbidden
状态码终止。
您可以通过更改配置文件中middleware.behaviour
的值来配置此行为。该包使用MiddlewareBehaviour
枚举作为配置值。
您可以使用middleware.code
配置选项更改状态码。
而不是终止,重定向
如果您更喜欢重定向而不是终止,请将middleware.behaviour
设置为MiddlewareBehaviour::Redirect
,并将middleware.redirect
设置为您的首选重定向位置。
多个功能
如果您愿意,可以通过多个功能标志来保护您的路由。您可以在定义路由中间件时,通过逗号分隔传递的标志来实现。
Route::get('/feature', fn () => ...)->middleware('feature:verified,two-factor');
测试
composer test
更新日志
有关最近更改的更多信息,请参阅更新日志。
贡献
有关详细信息,请参阅贡献指南。
安全漏洞
有关如何报告安全漏洞,请审查我们的安全策略。
鸣谢
许可
MIT 许可证(MIT)。有关更多信息,请参阅许可文件。