Skip to content

Commit 36dcc18

Browse files
authored
Merge pull request #19 from ericdowell/redis-driver
Redis Toggle Provider
2 parents 4a78424 + 5fdef9f commit 36dcc18

34 files changed

Lines changed: 376 additions & 54 deletions

.circleci/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ jobs:
33
build:
44
docker:
55
- image: ericdowell/laravel-circleci
6+
- image: redis:latest
67
environment:
78
TZ: "/usr/share/zoneinfo/America/Chicago"
89
steps:

composer.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
},
3535
"scripts": {
3636
"test": [
37-
"@php vendor/orchestra/testbench-core/create-sqlite-db",
3837
"phpunit --colors=always"
3938
]
4039
},
@@ -51,6 +50,9 @@
5150
"dev-master": "1.8-dev"
5251
}
5352
},
53+
"suggest": {
54+
"ext-redis": "Required to use the Redis driver."
55+
},
5456
"config": {
5557
"preferred-install": "dist",
5658
"sort-packages": true,

config/feature-toggle.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737
| status. The first provider to have a feature toggle defined, active
3838
| or not, will be used as the status value.
3939
|
40-
| Default Drivers: "conditional", "eloquent", "local", "querystring"
40+
| Default Drivers: "conditional", "eloquent", "local", "querystring",
41+
| "redis"
4142
|
4243
*/
4344

@@ -71,15 +72,17 @@
7172
| Additional Feature Toggle Drivers
7273
|--------------------------------------------------------------------------
7374
|
74-
| Classmap of drivers to load within the 'feature-api.*' container namespace.
75+
| Classmap of drivers that can be used in the "providers" config key above.
76+
| Drivers will be registered within the 'feature-api.*' container namespace.
7577
|
7678
| The driver class must implement FeatureToggle\Contracts\ToggleProvider.
7779
|
78-
| By default the following drivers are loaded:
80+
| By default the following drivers are registered:
7981
| - 'conditional' => \FeatureToggle\ConditionalToggleProvider::class,
8082
| - 'eloquent' => \FeatureToggle\EloquentToggleProvider::class,
8183
| - 'local' => \FeatureToggle\LocalToggleProvider::class,
8284
| - 'querystring' => \FeatureToggle\QueryStringToggleProvider::class,
85+
| - 'redis' => \FeatureToggle\RedisToggleProvider::class,
8386
|
8487
*/
8588

helpers.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
<?php
22

33
use FeatureToggle\Api;
4+
use FeatureToggle\Concerns\Toggle;
45
use FeatureToggle\Contracts\Api as FeatureToggleApi;
5-
use FeatureToggle\Traits\Toggle;
66

77
if (! function_exists('feature_toggle_api')) {
88
/**
9+
* @param string|null $provider
910
* @return FeatureToggleApi|Api
11+
* @throws RuntimeException
1012
*/
11-
function feature_toggle_api()
13+
function feature_toggle_api(?string $provider = null)
1214
{
13-
return app(FeatureToggleApi::class);
15+
/** @var FeatureToggleApi|Api $featureToggleApi */
16+
$featureToggleApi = app(FeatureToggleApi::class);
17+
if (! $provider) {
18+
return $featureToggleApi;
19+
}
20+
21+
return $featureToggleApi->getProvider($provider);
1422
}
1523
}
1624

phpunit.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,6 @@
4141
<env name="APP_ENV" value="testing"/>
4242
<env name="APP_DEBUG" value="true"/>
4343
<env name="APP_KEY" value="base64:oPF0DoJcm8nOjTkN9vk3kZYw6Z0f+cP+poFKhtQZiFU="/>
44-
<env name="DB_CONNECTION" value="sqlite"/>
44+
<env name="DB_CONNECTION" value="testing"/>
4545
</php>
4646
</phpunit>

readme.md

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ A simple feature toggle api for Laravel applications.
3535
- [QueryString Toggle Provider](#querystring-toggle-provider)
3636
- [Configure Query String Keys](#configure-query-string-keys)
3737
- [Add Api Key Authorization](#add-api-key-authorization)
38+
- [Redis Toggle Provider](#redis-toggle-provider)
3839
- [Frontend Feature Toggle Api](#frontend-feature-toggle-api)
3940
- [Road Map](#road-map)
4041

@@ -115,7 +116,7 @@ Or you can use the normal `@if` blade directive and call `feature_toggle` functi
115116
@endif
116117
// OR
117118
@if(feature_toggle('Example', 'off'))
118-
// do soemthing
119+
// do something
119120
@endif
120121
```
121122

@@ -207,6 +208,7 @@ The default feature toggle providers are as follows:
207208
- `eloquent`
208209
- `local` (config)
209210
- `querystring`
211+
- `redis`
210212

211213
You can access these directly via:
212214
```php
@@ -420,12 +422,38 @@ may configure the driver with a `token`/api key. By default the query string inp
420422
[
421423
'driver' => 'querystring',
422424
'apiKey' => env('FEATURE_TOGGLE_API_KEY'),
423-
// Optionally change to sometihing different than 'feature_token'.
425+
// Optionally change to something different.
424426
// 'apiInputKey' => 'feature_toggle_api_token',
425427
],
426428
],
427429
```
428430

431+
### Redis Toggle Provider
432+
To use the `redis` driver you will need to update the `feature-toggle` config/`setProviders` method call,
433+
place the following within the `providers` key:
434+
```php
435+
'providers' => [
436+
[
437+
'driver' => 'redis',
438+
],
439+
],
440+
```
441+
442+
There are three options that can be configured:
443+
- `key`, defaults to `feature_toggles`
444+
- `prefix`, defaults to `null`
445+
- `connection`, defaults to `default`
446+
```php
447+
'providers' => [
448+
[
449+
'driver' => 'querystring',
450+
'key' => 'toggles', // Optional, otherwise 'feature_toggles'
451+
'prefix' => 'feature', // Optional
452+
'connection' => 'toggles', // Must match key in database.redis.{connection}
453+
],
454+
],
455+
```
456+
429457
## Frontend Feature Toggle Api
430458
Place the following in your main layout blade template in the `<head>` tag.
431459
```blade
@@ -501,4 +529,6 @@ class App extends Component {
501529
- [x] Blade
502530
- [x] Middleware
503531
- [x] Validation
532+
- [ ] Create/update toggles via common contract interface.
533+
- [ ] Create Command to create/update toggles to be active/inactive.
504534
- [ ] Classmap Feature Toggles (FeatureToggleServiceProvider similar to AuthServiceProvider $policies).

src/Api.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44

55
namespace FeatureToggle;
66

7+
use FeatureToggle\Concerns\HasStaticOptions;
8+
use FeatureToggle\Concerns\ToggleProvider;
79
use FeatureToggle\Contracts\Api as ApiContract;
810
use FeatureToggle\Contracts\Toggle as ToggleContract;
911
use FeatureToggle\Contracts\ToggleProvider as ToggleProviderContract;
10-
use FeatureToggle\Traits\HasStaticOptions;
11-
use FeatureToggle\Traits\ToggleProvider;
1212
use Illuminate\Contracts\Container\BindingResolutionException;
1313
use Illuminate\Support\Arr;
1414
use Illuminate\Support\Collection;
@@ -117,6 +117,14 @@ public function getQueryStringProvider(): QueryStringToggleProvider
117117
return $this->getProvider(QueryStringToggleProvider::NAME);
118118
}
119119

120+
/**
121+
* @return ToggleProviderContract|RedisToggleProvider
122+
*/
123+
public function getRedisProvider(): RedisToggleProvider
124+
{
125+
return $this->getProvider(RedisToggleProvider::NAME);
126+
}
127+
120128
/**
121129
* @param string $name
122130
* @param callable $condition
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace FeatureToggle\Traits;
5+
namespace FeatureToggle\Concerns;
66

77
use Illuminate\Support\Arr;
88

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace FeatureToggle\Traits;
5+
namespace FeatureToggle\Concerns;
66

77
/**
88
* @property string $name
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace FeatureToggle\Traits;
5+
namespace FeatureToggle\Concerns;
66

77
use FeatureToggle\Contracts\Toggle as ToggleContract;
88
use FeatureToggle\Contracts\ToggleProvider as ToggleProviderContract;

0 commit comments

Comments
 (0)