evolabs/laravel-feature-flags

添加简单的数据库功能标志

1.0.4 2022-12-09 15:12 UTC

This package is auto-updated.

Last update: 2024-09-09 18:59:04 UTC


README

此包允许你在应用中添加标志,从而轻松开启/关闭其功能。

安装

您可以通过composer安装此包

composer require evolabs/laravel-feature-flags

此包将自动注册其服务提供者。

您可以使用以下命令发布和运行迁移

php artisan vendor:publish --provider="Evolabs\FeatureFlags\FeatureFlagsServiceProvider" --tag=migrations
php artisan migrate

您可以使用以下命令发布和自定义配置文件

php artisan vendor:publish --provider="Evolabs\FeatureFlags\FeatureFlagsServiceProvider" --tag=config

使用方法

功能存储在数据库中。要在应用中使用它们,您首先需要创建它们,例如通过数据库种子类

use Evolabs\FeatureFlags\Models\Feature;
use Illuminate\Database\Seeder;

class FeaturesTableSeeder extends Seeder
{
    public function run()
    {
        Feature::query()->create(['name' => 'information_pages'];
        Feature::query()->create(['name' => 'locale_change', 'group' => 'admin'];
    }
}

所有公共方法都通过外观类 Evolabs\FeatureFlags\Facades\Facades 提供。

检查功能是否可访问

Features::isAccessible('information_pages')

添加中间件以确保功能已启用

Route::get('/', 'YourController@index')->middleware('feature:information_pages')

使用 artisan 命令切换功能

php artisan feature:on information_pages

php artisan feature:off information_pages

列出所有功能

Features::all()

它将返回一个 FeatureData 对象的集合

namespace Evolabs\FeatureFlags\DataTransferObjects;

class FeatureData
{
    public function __construct(
        public readonly string $name,
        public readonly ?string $group,
        public readonly bool $is_enabled
    ) {
    }
}

创建功能组,例如后台或前端区域

Feature::query()->create(['name' => 'information_pages', 'group' => 'admin'];
Feature::query()->create(['name' => 'media_library', 'group' => 'admin'];

然后您可以加载组中的所有功能

Features::all('admin')

在 blade 视图中使用功能标志

@feature('information_pages')
    <p>Feature flag `information_pages` is turned on.</p>
@endfeature

在 Inertia 和 vue 中使用功能标志

您可以在 HandleInertiaRequests 中间件类中加载功能标志

use Evolabs\FeatureFlags\Facades\Features;
use Illuminate\Http\Request;
use Inertia\Middleware;

class HandleInertiaRequests extends Middleware
{
    /**
     * The root template that's loaded on the first page visit.
     *
     * @see https://inertia.laravel.net.cn/server-side-setup#root-template
     *
     * @var string
     */
    protected $rootView = 'admin/app';

    /**
     * Defines the props that are shared by default.
     *
     * @see https://inertia.laravel.net.cn/shared-data
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function share(Request $request)
    {
        return [
            ...parent::share($request),
            'features' => Features::all('admin')->pluck('is_enabled', 'name')
        ];
    }
}

并在您的 vue 模板中使用它们

<div v-if="$page.props.features.information_pages">
    <p>Feature flag `information_pages` is turned on.</p>
</div>