evolabs / laravel-feature-flags
Add simple database feature flags
Requires
- php: ^8.1
- illuminate/cache: ^9.0
- illuminate/console: ^9.0
- illuminate/database: ^9.0
- illuminate/routing: ^9.0
Requires (Dev)
- laravel/pint: dev-main
- phpstan/phpstan: 1.9.x-dev
README
This package allows you to add flags in your application and thus easily turn on/off its features.
Installation
You can install the package via composer:
composer require evolabs/laravel-feature-flags
The package will automatically register its service provider.
You can publish and run the migrations with:
php artisan vendor:publish --provider="Evolabs\FeatureFlags\FeatureFlagsServiceProvider" --tag=migrations
php artisan migrate
You can publish and customize config file with:
php artisan vendor:publish --provider="Evolabs\FeatureFlags\FeatureFlagsServiceProvider" --tag=config
Usage
Features are storing in database. To use them in your application you should first create them e.g. via database seeder class:
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']; } }
All public methods are available via the facade class Evolabs\FeatureFlags\Facades\Facades
.
Check feature is accessible
Features::isAccessible('information_pages')
Add middleware to ensure that feature is enabled
Route::get('/', 'YourController@index')->middleware('feature:information_pages')
Toggle features with artisan commands
php artisan feature:on information_pages php artisan feature:off information_pages
List all features
Features::all()
It will returns a collection of FeatureData
objects:
namespace Evolabs\FeatureFlags\DataTransferObjects; class FeatureData { public function __construct( public readonly string $name, public readonly ?string $group, public readonly bool $is_enabled ) { } }
Create feature groups e.g. for back office or frontend area
Feature::query()->create(['name' => 'information_pages', 'group' => 'admin']; Feature::query()->create(['name' => 'media_library', 'group' => 'admin'];
You can then load all the features in group:
Features::all('admin')
Use feature flags in blade views
@feature('information_pages') <p>Feature flag `information_pages` is turned on.</p> @endfeature
Use feature flags with Inertia and vue
You can load feature flags in HandleInertiaRequests
middleware class:
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://inertiajs.com/server-side-setup#root-template * * @var string */ protected $rootView = 'admin/app'; /** * Defines the props that are shared by default. * * @see https://inertiajs.com/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') ]; } }
and use them in your vue template:
<div v-if="$page.props.features.information_pages"> <p>Feature flag `information_pages` is turned on.</p> </div>