{"id":19164383,"url":"https://github.com/ericdowell/feature-toggle","last_synced_at":"2025-10-08T17:47:45.832Z","repository":{"id":40380368,"uuid":"201544436","full_name":"ericdowell/feature-toggle","owner":"ericdowell","description":"A simple feature toggle api for Laravel applications.","archived":false,"fork":false,"pushed_at":"2025-03-02T01:49:56.000Z","size":208,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-06T18:58:51.726Z","etag":null,"topics":["conditional-toggles","database","database-toggles","feature","feature-flag","feature-flags","feature-toggle","feature-toggles","features","laravel","local-toggles","querystring-toggles","redis","redis-toggles","toggle-providers","toggles"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ericdowell.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-08-09T21:46:29.000Z","updated_at":"2025-03-02T01:48:27.000Z","dependencies_parsed_at":"2024-02-11T22:47:35.425Z","dependency_job_id":null,"html_url":"https://github.com/ericdowell/feature-toggle","commit_stats":{"total_commits":188,"total_committers":4,"mean_commits":47.0,"dds":0.04255319148936165,"last_synced_commit":"71cd9dd1094efdc96eb712d52606c95c2eeafb39"},"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericdowell%2Ffeature-toggle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericdowell%2Ffeature-toggle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericdowell%2Ffeature-toggle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericdowell%2Ffeature-toggle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ericdowell","download_url":"https://codeload.github.com/ericdowell/feature-toggle/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252873938,"owners_count":21817708,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["conditional-toggles","database","database-toggles","feature","feature-flag","feature-flags","feature-toggle","feature-toggles","features","laravel","local-toggles","querystring-toggles","redis","redis-toggles","toggle-providers","toggles"],"created_at":"2024-11-09T09:21:48.365Z","updated_at":"2025-10-08T17:47:45.746Z","avatar_url":"https://github.com/ericdowell.png","language":"PHP","readme":"# Feature Toggles\n[![CircleCI](https://circleci.com/gh/ericdowell/feature-toggle.svg?style=svg)](https://circleci.com/gh/ericdowell/feature-toggle)\n[![StyleCI](https://github.styleci.io/repos/201544436/shield?branch=master)](https://github.styleci.io/repos/201544436)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/78a76b330bb8654c44ff/test_coverage)](https://codeclimate.com/github/ericdowell/feature-toggle/test_coverage)\n[![Maintainability](https://api.codeclimate.com/v1/badges/78a76b330bb8654c44ff/maintainability)](https://codeclimate.com/github/ericdowell/feature-toggle/maintainability)\n\n[![License](https://poser.pugx.org/ericdowell/feature-toggle/license?format=flat-square)](https://packagist.org/packages/ericdowell/feature-toggle)\n[![Latest Stable Version](https://poser.pugx.org/ericdowell/feature-toggle/version?format=flat-square)](https://packagist.org/packages/ericdowell/feature-toggle)\n[![Latest Unstable Version](https://poser.pugx.org/ericdowell/feature-toggle/v/unstable?format=flat-square)](https://packagist.org/packages/ericdowell/feature-toggle)\n[![Total Downloads](https://poser.pugx.org/ericdowell/feature-toggle/downloads?format=flat-square)](https://packagist.org/packages/ericdowell/feature-toggle)\n\nA simple feature toggle api for Laravel applications.\n\n## Table of Contents\n- [Installation](#installation)\n- [Testing](#testing)\n- [Usage](#usage)\n    - [Toggle Booting](#toggle-booting)\n    - [Helper Functions](#helper-functions)\n    - [Use with Laravel Blade Custom Directive](#use-with-laravel-blade-custom-directive)\n    - [Use with Laravel Middleware](#use-with-laravel-middleware)\n    - [Use with Laravel Task Scheduling](#use-with-laravel-task-scheduling)\n    - [Use with Laravel Validation](#use-with-laravel-validation)\n        - [Simple String](#simple-string)\n        - [Via Illuminate\\Validation\\Rule](#via-illuminatevalidationrule)\n        - [requiredIfRule Method on FeatureToggleApi](#requiredifrule-method-on-featuretoggleapi)\n- [Toggle Providers](#toggle-providers)\n    - [Add Additional Toggle Providers](#add-additional-toggle-providers)\n    - [Local Feature Toggles](#local-feature-toggles)\n        - [Toggle Parsing](#toggle-parsing)\n    - [Conditional Feature Toggles](#conditional-feature-toggles)\n    - [Eloquent Feature Toggles](#eloquent-feature-toggles)\n        - [Database Migration](#database-migration)\n        - [Eloquent Model](#eloquent-model)\n    - [QueryString Toggle Provider](#querystring-toggle-provider)\n        - [Configure Query String Keys](#configure-query-string-keys)\n        - [Add Api Key Authorization](#add-api-key-authorization)\n    - [Redis Toggle Provider](#redis-toggle-provider)\n    - [Session Toggle Provider](#session-toggle-provider)\n- [Frontend Feature Toggle Api](#frontend-feature-toggle-api)\n- [Road Map](#road-map)\n\n## Installation\nInstall using composer by running:\n```bash\ncomposer require ericdowell/feature-toggle ^1.11\n```\n\nPublish the `feature-toggle.php` config file by running:\n```bash\nphp artisan vendor:publish --tag=\"feature-toggle-config\"\n```\n\n## Testing\nRun `composer test`.\n\n## Usage\nIf a feature toggle is not defined then `isActive` will return `false`.\n\n## Toggle Booting\nThe Feature Toggle Api will pull all possible toggles at the boot of the application. This design allows there to\nbe one database/cache/redis query instead of possibly many calls. This only becomes a problem if\nthere're 100s of feature toggles.\n\nBe mindful of how many database toggles are setup at given time, instead setup or move toggles to the local provider\nin `config/feature-toggle.php`.\n\n### Helper Functions\n`feature_toggle_api`:\n```php\nif (feature_toggle_api()-\u003eisActive('Example')) {\n    // do something\n}\n```\nOr a shorter function that does the same as above called `feature_toggle`:\n```php\nif (feature_toggle('Example')) {\n    // do something\n}\n```\nThe `feature_toggle` function also allows a second parameter to be passed to allow for checking if the toggle is\nactive (`true`) or if it is inactive (`false`):\n```php\nif (feature_toggle('Example', false)) {\n    // do something when toggle is inactive\n}\n// OR\nif (feature_toggle('Example', 'off')) {\n    // do something when toggle is inactive\n}\n```\nThe second parameter will parse as the local toggle does, read more in the [Toggle Parsing](#toggle-parsing) section to\nlearn more.\n\n### Use with Laravel Blade Custom Directive\nThis custom directive uses the `feature_toggle` helper function directly, you can expect the same behavior:\n```blade\n@featureToggle('Example')\n    // do something\n@endfeatureToggle\n```\nOr if you'd like to check if the `Example` is inactive then you may pass a falsy value as the second parameter:\n```blade\n// returns true if toggle is inactive\n@featureToggle('Example', false)\n    // do something\n@endfeatureToggle\n// OR\n@featureToggle('Example', 'off')\n    // do something\n@endfeatureToggle\n```\nOr you can use the normal `@if` blade directive and call `feature_toggle` function directly:\n```blade\n@if(feature_toggle('Example'))\n    // do something\n@endif\n// OR\n@if(feature_toggle('Example', 'off'))\n    // do something\n@endif\n```\n\n### Use with Laravel Middleware\nThe middleware signature is as follows:\n```\nfeatureToggle:{name},{status},{abort}\n```\nWhere `status` and `abort` are optional parameters. `status` will default to `true` (truthy) and `abort` will default to\n`404` status code. `name` is required.\n\n**Examples:**\n```php\nuse Illuminate\\Support\\Facades\\Route;\n\n// Passing all three parameters, changing abort to 403 status code.\nRoute::get('user/billing')-\u003emiddleware('featureToggle:subscription,true,403')-\u003euses('User\\\\BillingController@index')-\u003ename('billing.index');\n// Passing two parameters.\nRoute::get('user/subscribe')-\u003emiddleware('featureToggle:subscription,true')-\u003euses('User\\\\SubscribeController@index')-\u003ename('subscribe.index');\n// Passing just the name.\nRoute::get('user/trial')-\u003emiddleware('featureToggle:trial')-\u003euses('User\\\\TrialController@index')-\u003ename('trial.index');\n```\n\n### Use with Laravel Task Scheduling\nYou can use the built-in `when` function in combination with the `feature_toggle` helper function in the `app/Console/Kernel.php`\n`schedule` method.\n```php\nuse Illuminate\\Console\\Scheduling\\Schedule;\nuse Illuminate\\Foundation\\Console\\Kernel as ConsoleKernel;\n\nclass Kernel extends ConsoleKernel\n{\n    protected function schedule(Schedule $schedule)\n    {\n        $schedule-\u003ecommand('inspire')\n                 -\u003ehourly()\n                 -\u003ewhen(feature_toggle('Inspire Command'));\n    }\n}\n```\n\n### Use with Laravel Validation\nThere are three ways you can use the validation logic:\n- Simple String\n- Via `Illuminate\\Validation\\Rule`\n- `requiredIfRule` Method on `FeatureToggleApi`\n\n#### Simple String\nUse the normal simple string signature via `required_if_feature`:\n```\nrequired_if_feature:{name},{status}\n```\nWhere `status` is an optional parameter. `status` will default to `true` (truthy). `name` parameter is required.\n\n```php\nuse Illuminate\\Support\\Facades\\Validator;\n\nValidator::make(request()-\u003eall(), [\n    'phone' =\u003e 'required_if_feature:Require phone',\n]);\n\nValidator::make(request()-\u003eall(), [\n    'phone' =\u003e 'required_if_feature:Require phone,on',\n]);\n```\n\n#### Via Illuminate\\Validation\\Rule\nA macro method has been added to the `Rule` class called `requiredIfFeature`:\n```php\nuse Illuminate\\Support\\Facades\\Validator;\nuse Illuminate\\Validation\\Rule;\n\nValidator::make(request()-\u003eall(), [\n    'phone' =\u003e Rule::requiredIfFeature('Require phone'),\n]);\n\nValidator::make(request()-\u003eall(), [\n    'phone' =\u003e Rule::requiredIfFeature('Require phone', true),\n]);\n```\n\n#### requiredIfRule Method on FeatureToggleApi\nYou may also use the `requiredIfRule` method on the `FeatureToggleApi`/`feature_toggle_api` Facade or helper function:\n```php\nuse FeatureToggle\\Facades\\FeatureToggleApi;\nuse Illuminate\\Support\\Facades\\Validator;\n\nValidator::make(request()-\u003eall(), [\n    'phone' =\u003e FeatureToggleApi::requiredIfRule('Require phone'),\n]);\n\nValidator::make(request()-\u003eall(), [\n    'phone' =\u003e feature_toggle_api()-\u003erequiredIfRule('Require phone', true),\n]);\n```\n\n## Toggle Providers\nThe default feature toggle providers are as follows:\n- `conditional`\n- `eloquent`\n- `local` (config)\n- `querystring`\n- `redis`\n- `session`\n\nYou can pass the `feature_toggle_api` helper function one of the above strings to get the toggle provider:\n```php\n$redisProvider = feature_toggle_api('redis');\n// return false\n$redisProvider-\u003eisActive('Example Off');\n\n$sessionProvider = feature_toggle_api('session');\n// return false\n$sessionProvider-\u003eisActive('Example False');\n```\n\nOr you can access each toggle provider via:\n- `feature_toggle_api()-\u003egetConditionalProvider()`\n- `feature_toggle_api()-\u003egetEloquentProvider()`\n- `feature_toggle_api()-\u003egetLocalProvider()`\n- `feature_toggle_api()-\u003egetQueryStringProvider()`\n- `feature_toggle_api()-\u003egetRedisProvider()`\n- `feature_toggle_api()-\u003egetSessionProvider()`\n\nE.g.\n```php\n$localProvider = feature_toggle_api()-\u003egetLocalProvider();\n// return false\n$localProvider-\u003eisActive('Example');\n\n// Returns by reference.\n$conditionalProvider = feature_toggle_api()-\u003egetConditionalProvider();\n$conditionalProvider-\u003esetToggle('Example', function() { return true; });\n// return true\n$conditionalProvider-\u003eisActive('Example');\n\n// Request ?feature=Example\n$queryStringProvider = feature_toggle_api()-\u003egetQueryStringProvider();\n// return true\n$queryStringProvider-\u003eisActive('Example');\n\n$eloquentProvider = feature_toggle_api()-\u003egetEloquentProvider();\n// return false\n$eloquentProvider-\u003eisActive('Example');\n```\n\nIf you would like to set the `providers` in code you may call the following in the `boot` method of your\n`AppServiceProvider`:\n```php\nfeature_toggle_api()-\u003esetProviders([\n    [\n        'driver' =\u003e 'conditional',\n    ],\n    [\n        'driver' =\u003e 'eloquent',\n    ],\n]);\n```\n\n### Add Additional Toggle Providers\nYou may add additional custom toggle providers or override the default toggle providers by adding them to the `drivers`\nkey within `config/feature-toggle.php`:\n```php\nreturn [\n    'drivers' =\u003e [\n        'local' =\u003e \\App\\FeatureToggle\\LocalToggleProvider::class,\n        'redis' =\u003e \\App\\FeatureToggle\\RedisToggleProvider::class,\n        'session' =\u003e \\App\\FeatureToggle\\SessionToggleProvider::class,\n    ],\n];\n```\nThen just add them in the order you'd like them to be checked within `providers` as you would the defaults:\n```php\nreturn [\n    'providers' =\u003e [\n        [\n            'driver' =\u003e 'session',\n        ],\n        [\n            'driver' =\u003e 'conditional',\n        ],\n        [\n            'driver' =\u003e 'redis',\n        ],\n        [\n            'driver' =\u003e 'local',\n        ],\n    ],\n];\n```\n\n### Local Feature Toggles\nTo add new toggle(s) you will need to update the published `config/feature-toggles.php` file:\n```php\nreturn [\n    // ...\n    'toggles' =\u003e [\n        'Example' =\u003e env('FEATURE_EXAMPLE'),\n        'Show Something' =\u003e env('FEATURE_SHOW_SOMETHING'),\n    ],\n];\n```\n#### Toggle Parsing\nThe value passed from the `.env` file or set directly within config file can be:\n- A `boolean`: `true`/`false`\n- An `int` version of `boolean`: `1`/`0`\n- Finally all supported values of  [filter_var($value, FILTER_VALIDATE_BOOLEAN)](https://www.php.net/manual/en/filter.filters.validate.php)\n\n### Conditional Feature Toggles\nTo add new conditional toggle(s) you will need to call `feature_toggle_api()-\u003esetConditional` method:\n```php\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Cache;\n\n// calling conditional function is deferred by default\nfeature_toggle_api()-\u003esetConditional('Example', function (Request $request) {\n    $user = $request-\u003euser();\n    return $user instanceof \\App\\User \u0026\u0026 $user-\u003eemail === 'johndoe@example.com';\n});\n\n// OR call right away by passing false as $defer parameter\nfeature_toggle_api()-\u003esetConditional('Example', function () {\n    return Cache::get('feature:example');\n}, false);\n```\n**NOTE:** The function passed to `setConditional` does not get called right away by default, it is deferred to allow\nthe Laravel app to bootstrap User/Session information. The conditional function is only called once and the value\nis cached to help prevent expensive operations from being recalculated when adding additional conditional toggles.\nBecause of this design it is best to define these in `AppServiceProvider@boot` or in a\n`FeatureToggleServiceProvider@boot` that you create.\n\n### Eloquent Feature Toggles\nTo use the `eloquent` driver you will need to update the `feature-toggle` config or `setProviders` method call,\nplace the following within the `providers` key:\n```php\n[\n    'providers' =\u003e [\n        [\n            'driver' =\u003e 'eloquent',\n        ],\n    ],\n];\n```\nOR\n```php\nfeature_toggle_api()-\u003esetProviders([\n    [\n        'driver' =\u003e 'conditional',\n    ],\n    [\n        'driver' =\u003e 'eloquent',\n    ],\n    [\n        'driver' =\u003e 'local',\n    ],\n]);\n```\n**NOTE:** Be sure to place this value in the order you would like it to be prioritized by the feature toggle api.\n\n#### Database Migration\nBy default the migration for `feature_toggles` is not loaded, to load this you can update the `options` key\nwithin `feature-toggle` config setting the `useMigrations` value to `true`:\n```php\nreturn [\n    'options' =\u003e [\n        'useMigrations' =\u003e true,\n    ],\n];\n```\n\nIf you would like to set the `useMigrations` in code you may call the following in the `register` method of your\n`AppServiceProvider`:\n```php\nuse FeatureToggle\\Api;\n\nApi::useMigrations();\n```\n\nYou may also publish the `migrations` to your application by running the following:\n```bash\nphp artisan vendor:publish --tag=\"feature-toggle-migrations\"\n```\n\nOnce you've used one of the methods above, you can run the following command to update your database with\nthe `feature_toggles` migration(s):\n```bash\nphp artisan migrate\n```\n\n#### Eloquent Model\nIf you would like to use a different eloquent model you may do so by adding `model` to the config file:\n```php\nreturn [\n    'providers' =\u003e [\n        [\n            'driver' =\u003e 'eloquent',\n            'model' =\u003e \\App\\FeatureToggle::class\n        ],\n    ],\n];\n```\n\n### QueryString Toggle Provider\nTo use the `querystring` driver you will need to update the `feature-toggle` config or `setProviders` method call,\nplace the following within the `providers` key:\n```php\n[\n    'providers' =\u003e [\n        [\n            'driver' =\u003e 'querystring',\n        ],\n    ],\n];\n```\n\nWhen making a request to your application you may now use the following query strings to make feature toggles active/inactive:\n- `feature`\n- `feature_off`\n\ne.g. `http://localhost/?feature=Example\u0026feature_off[]=Example%20Off\u0026feature_off[]=Example%20Query%20String`\n\nThe following example will result in `Example` as active and `Example Off`/`Example Query String` as inactive. **NOTE:**\nThis will only be true if the `querystring` provider is placed above other toggle providers that haven't already defined\nthese feature toggles.\n\n#### Configure Query String Keys\nIf you'd like to configure what the `active`/`inactive` feature toggle input keys are you may add `activeKey`\nand `inactiveKey` to config file.\n\nBelow is an example of configuring the query string keys as `active` and `inactive`:\n```php\nreturn [\n    'providers' =\u003e [\n        [\n            'driver' =\u003e 'querystring',\n            'activeKey' =\u003e 'active',\n            'inactiveKey' =\u003e 'inactive',\n        ],\n    ],\n];\n```\n\n#### Add Api Key Authorization\nTo keep users or bad actors from enabling/disabling feature toggles via the `querystring` toggle provider you\nmay configure the driver with a `token`/api key. By default the query string input is configured as\n`feature_token`, but this can be also be configured to any value.\n```php\nreturn [\n    'providers' =\u003e [\n        [\n            'driver' =\u003e 'querystring',\n            'apiKey' =\u003e env('FEATURE_TOGGLE_API_KEY'),\n            // Optionally change to something different.\n            // 'apiInputKey' =\u003e 'feature_toggle_api_token',\n        ],\n    ],\n];\n```\n\n### Redis Toggle Provider\nTo use the `redis` driver you will need to update the `feature-toggle` config or `setProviders` method call,\nplace the following within the `providers` key:\n```php\n[\n    'providers' =\u003e [\n        [\n            'driver' =\u003e 'redis',\n        ],\n    ],\n];\n```\n\nThere are three options that can be configured:\n- `key`, defaults to `feature_toggles`\n- `prefix`, defaults to `null`\n- `connection`, defaults to `default`\n```php\nreturn [\n    'providers' =\u003e [\n        [\n            'driver' =\u003e 'redis',\n            'key' =\u003e 'toggles', // Optional, otherwise 'feature_toggles'\n            'prefix' =\u003e 'feature', // Optional\n            'connection' =\u003e 'toggles', // Must match key in database.redis.{connection}\n        ],\n    ],\n];\n```\n\nCurrent implementation requires the array of toggles to be serialized in redis, you can use\n`Illuminate\\Cache\\RedisStore` `forever` method to persist toggle values.\n\n### Session Toggle Provider\nTo use the `session` driver you will need to update the `feature-toggle` config or `setProviders` method call,\nplace the following within the `providers` key:\n```php\n[\n    'providers' =\u003e [\n        [\n            'driver' =\u003e 'session',\n        ],\n    ],\n];\n```\n\n\n## Frontend Feature Toggle Api\nPlace the following in your main layout blade template in the `\u003chead\u003e` tag.\n```blade\n\u003cscript\u003e\n    window.activeToggles = Object.freeze({!! feature_toggle_api()-\u003eactiveTogglesToJson() !!});\n\u003c/script\u003e\n```\n\nThen create a new js file within `resources/js` called `featureToggle.js`:\n```js\nconst toggles = Object.keys(window.activeToggles || {})\n\nexport const featureToggle = (name, checkActive = true) =\u003e\n    checkActive ? toggles.includes(name) : !toggles.includes(name)\n```\n\nExpose on the `window` within `app.js`:\n```js\nimport { featureToggle } from './featureToggle'\n\n// ...\n\nwindow.featureToggle = featureToggle\n```\n\nand/or simply use `featureToggle` within your other js files:\n```js\nimport { featureToggle } from './featureToggle'\n\nif (featureToggle('Example')) {\n    // do something about it.\n}\n```\n\nand/or create a `Feature` component that uses `featureToggle.js`:\n```js\n// Feature.js\nimport { featureToggle } from './featureToggle'\n\nexport const Feature = ({ name, active: checkActive = true, children }) =\u003e {\n    return featureToggle(name, checkActive) \u0026\u0026 children\n}\n```\n```jsx\n// App.js\nimport React, { Component, Fragment } from 'react'\nimport { Feature } from './Feature'\n\nclass App extends Component {\n    render() {\n        return (\n            \u003cFragment\u003e\n                \u003cNavigation /\u003e\n                \u003cFeature name=\"Show Something\"\u003e\n                   \u003cSomething /\u003e\n                \u003c/Feature\u003e\n                \u003cFeature name=\"Show Something\" active={false}\u003e\n                   \u003cp\u003eNothing to see here!\u003c/p\u003e\n                \u003c/Feature\u003e\n            \u003c/Fragment\u003e\n        )\n    }\n}\n```\n\n## Road Map\n### v1.x\n- [x] Local Feature Toggles via Config.\n- [x] Conditionally Enable/Disable Feature Toggles e.g. Authorization.\n- [x] Eloquent Feature Toggles.\n- [x] Query String Feature Toggles.\n- [x] Integrate toggles into:\n    - [x] Blade\n    - [x] Middleware\n    - [x] Validation\n### v2.x\n- [ ] Create/update toggles via common contract interface.\n- [ ] Create Command to create/update toggles to be active/inactive.\n- [ ] Classmap Feature Toggles (FeatureToggleServiceProvider similar to AuthServiceProvider $policies).\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericdowell%2Ffeature-toggle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericdowell%2Ffeature-toggle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericdowell%2Ffeature-toggle/lists"}