niborb/php-feature-toggle

A PHP feature toggle library

Maintainers

Package info

github.com/niborb/php-feature-toggle

pkg:composer/niborb/php-feature-toggle

Statistics

Installs: 523

Dependents: 0

Suggesters: 0

Stars: 5

Open Issues: 0

1.0.1 2015-11-08 20:55 UTC

This package is not auto-updated.

Last update: 2026-04-21 08:19:16 UTC


README

A small, dependency-light feature toggle library for PHP 8.2+. Features can be toggled on/off and optionally gated behind a Symfony ExpressionLanguage expression evaluated against a runtime context.

Requirements

  • PHP ^8.2
  • symfony/expression-language ^6.4 || ^7.0

Installation

composer require niborb/php-feature-toggle

See also packagist.org/packages/niborb/php-feature-toggle.

Quick start

<?php

require 'vendor/autoload.php';

use Niborb\FeatureToggle\Entity\Feature;
use Niborb\FeatureToggle\Toggle;

$toggle = new Toggle();

$feature = (new Feature('user-interface-2.0'))->enable();
$toggle->addFeature($feature);

if ($toggle->isEnabled('user-interface-2.0')) {
    echo 'New UI enabled' . PHP_EOL;
}

Expression-based toggles

Pass a Symfony ExpressionLanguage instance to the Toggle constructor and attach an expression to a feature. The expression is evaluated against the context array passed to isEnabled().

<?php

require 'vendor/autoload.php';
require 'User.php';

use Niborb\FeatureToggle\Entity\Feature;
use Niborb\FeatureToggle\Toggle;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

$toggle = new Toggle(
    new ExpressionLanguage(new ArrayAdapter()), // optional PSR-6 cache pool
);

$feature = (new Feature('user-interface-2.0'))
    ->enable()
    ->setExpression('user.getId() in 1000..2000');

$toggle->addFeature($feature);

foreach ([new User(3000), new User(1500)] as $user) {
    $enabled = $toggle->isEnabled('user-interface-2.0', ['user' => $user]);
    echo "User {$user->getId()} " . ($enabled ? 'can' : 'cannot') . " see new interface" . PHP_EOL;
}

Output:

User 3000 cannot see new interface
User 1500 can see new interface

More runnable examples in examples/.

Custom data providers

Toggle defaults to an in-memory ArrayDataProvider. You can plug in any implementation of Niborb\FeatureToggle\DataProvider:

$toggle = new Toggle(null, new MyDatabaseDataProvider($pdo));

Development

composer install
composer test       # PHPUnit
composer phpstan    # PHPStan (level 8)

Changelog

See CHANGELOG.md for the list of changes and the migration guide from v0.x.

License

MIT — see LICENSE.