generated from spatie/package-skeleton-laravel
-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
bc7696c
commit 8d75bf6
Showing
17 changed files
with
340 additions
and
45 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,6 @@ | |
build | ||
composer.lock | ||
coverage | ||
docs | ||
phpunit.xml | ||
phpstan.neon | ||
testbench.yaml | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
--- | ||
title: 'Introduction' | ||
description: 'A simple trait to enable Laravel Pennant features using Enums' | ||
navigation.title: 'Introduction' | ||
--- | ||
|
||
# Laravel Enum Features | ||
|
||
<a href="https://packagist.org/packages/defstudio/enum-features" target="_blank"><img style="display: inline-block; margin-top: 0.5em; margin-bottom: 0.5em" src="https://img.shields.io/packagist/v/defstudio/enum-features.svg?style=flat&cacheSeconds=3600" alt="Latest Version on Packagist"></a> | ||
<a href="https://github.com/defstudio/enum-features/actions/workflows/run-tests.yml" target="_blank"><img style="display: inline-block; margin-top: 0.5em; margin-bottom: 0.5em" src="https://img.shields.io/github/actions/workflow/status/defstudio/enum-features/run-tests.yml?branch=main&label=tests&cacheSeconds=3600&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAMAAABF0y+mAAABiVBMVEUAAAD/iPv9yP3Xm+j/mP//wfVj67Je6bP/h/pVx6p6175d57WQycf+iPn/iPrsnezArd3+t/qpvNJd6LP/jPpu6rv/lPr/kPpc57T/rvtc57Np6rj3oPl37cL/tfn/wv9d6brX//L/g/rYn+n/gvrWm+di6LX+jPrskfGWzMpt6bln4bdd57Jk6LWSycj+vPquwNVo6rde6bP7nvvYnup91b/+vfv/lvtc57OqvNTFs9//t/td57L9t/r/iPpd6LPapej/ovp26bxy67v9lfld6LJr4Ljwsvb/xv3/jv39zv1t6buG5cTDreH5ivlc5rJy676V4cxb57D/y/h50MOy4OCUxcVa77X/iPpe6LP/jP+pu9L8t///tvuQycfArNxp6LzArd151r7/i/9n4bb/j/9e6rT/ifr7ifrskvLYnuhi87tg8blg7bf/vv//lP+wxNtj9b3/qv//oP/+ivz/l/r8ifryn/fvlPTfpPDeofDKtujHtOWX1NF/4seC3cR82sFu7cBo5LiMwPMrAAAAWHRSTlMA/Wv8FAIC/dME/Wj+3tEG/Pv798G1oHRjS0k1LBsWDgsJ/v36+fTy8ezn4+Lh29XNzMzLysLAwLSwr66opJqakY+Ni4J7end0bGlpY11XU048KicmIR8fizl+vwAAAVdJREFUKM9tz2VXAlEQgOFBBURpkE67u7u7E1YFYQl1SbvrlztDiLvss+fc/fCemXMvAEhhKqU759P1rLoxUDUyEh9fPH0z7ALiVrEY+SSNtxNS2upouYv7hOL191aKVsZHUTgbnQPQgDkq4ctHdoQmTWmW4WFzlVUDVpNKXf2fWpWbZIwUq/hcmjWGYnSa1pZZjEoomrEdVAisD7CX6GEb40rqTODxCj21OjDOvjRV8l2jhudBDchg/FUbDIZCITzwQyH6a9+2AMDbm9GfltFnxgAdtQWUgQJl4VQq37uPcSnsfYZzav6Ew18fQ4fUYPM7Qn4uSiIdyx5saJ6T+/3+5KSltshicwI2UpfAKE/aoARTvnn7KMYMdlAUyWRSyHN2JeU42HlCi4TszTHcmuj3iMVdP5JzoyAWNzi6T3ZGrMFCliK3BAqRSC/B2+6IxvYYNcO+2Npfv+yFi10LfBUAAAAASUVORK5CYII=" alt="Tests"></a> | ||
<a href="https://github.com/defstudio/enum-features/actions/workflows/fix-php-code-style-issues.yml" target="_blank"><img style="display: inline-block; margin-top: 0.5em; margin-bottom: 0.5em" src="https://img.shields.io/github/actions/workflow/status/defstudio/enum-features/fix-php-code-style-issues.yml?branch=main&label=code%20style&cacheSeconds=3600" alt="Code Style"></a> | ||
<a href="https://github.com/defstudio/enum-features/actions/workflows/phpstan.yml" target="_blank"><img style="display: inline-block; margin-top: 0.5em; margin-bottom: 0.5em" src="https://img.shields.io/github/actions/workflow/status/defstudio/enum-features/phpstan.yml?branch=main&label=phpstan&cacheSeconds=3600" alt="Static Analysis"></a> | ||
<a href="https://packagist.org/packages/defstudio/enum-features" target="_blank"><img style="display: inline-block; margin-top: 0.5em; margin-bottom: 0.5em" src="https://img.shields.io/packagist/dt/defstudio/enum-features.svg?style=flat&cacheSeconds=3600" alt="Total Downloads"></a> | ||
<a href="https://packagist.org/packages/defstudio/enum-features" target="_blank"><img style="display: inline-block; margin-top: 0.5em; margin-bottom: 0.5em" src="https://img.shields.io/packagist/l/defstudio/enum-features?style=flat&cacheSeconds=3600" alt="License"></a> | ||
<a href="https://twitter.com/FabioIvona?ref_src=twsrc%5Etfw" target="_blank"><img style="display: inline-block; margin-top: 0.5em; margin-bottom: 0.5em" alt="Twitter Follow" src="https://img.shields.io/twitter/follow/FabioIvona?label=Follow&style=social"></a> | ||
|
||
|
||
#### A simple trait to enable Laravel Pennant features using Enums | ||
|
||
|
||
```php | ||
if(AppFeature::welcome_email->active()){ | ||
Mail::to($newUser)->send(new WelcomeEmail($newUser)); | ||
} | ||
``` | ||
|
||
[replace:full-source-code] | ||
|
||
|
||
[replace:powered-by] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[replace:about-us] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
--- | ||
title: 'Feature Resolution' | ||
description: '' | ||
--- | ||
|
||
## Feature Resolution | ||
|
||
On the first check for each scope, Laravel Pennant requires you to resolve if the feature is enabled for that scope. This can be done in your enum code: | ||
|
||
### Single Catch-All Method | ||
|
||
The resolve method can be overridden in order to return `true`/`false` for that user | ||
|
||
```php | ||
use DefStudio\EnumFeatures\EnumFeatures; | ||
|
||
enum AppFeature | ||
{ | ||
use DefinesFeatures; | ||
|
||
case multi_language; | ||
case impersonate; | ||
case welcome_email; | ||
|
||
protected function resolve(Authenticatable $user = null) { | ||
match($this){ | ||
case self::multi_language => true, | ||
case self::impersonate => $user->isAdmin(), | ||
default => false; | ||
} | ||
} | ||
} | ||
``` | ||
|
||
### A dedicated method for each feature | ||
|
||
The `DefineFeatures` trait can check if a `resolve[FeatureName]` method exists, and will use it to determine if the feature is enabled. | ||
|
||
> [!WARNING] | ||
> The feature is considered to be disabled if no `resolve[FeatureName]` method is defined for it | ||
```php | ||
use DefStudio\EnumFeatures\EnumFeatures; | ||
|
||
enum AppFeature | ||
{ | ||
use DefinesFeatures; | ||
|
||
case multi_language; | ||
case impersonate; | ||
case welcome_email; | ||
|
||
protected function resolveImpersonate(Authenticatable $user = null){ | ||
return $user->isSuperAdmin(); | ||
} | ||
|
||
protected function resolveWelcomeEmail(Authenticatable $user = null){ | ||
return true; | ||
} | ||
} | ||
``` | ||
|
||
> [!NOTE] | ||
> the trait will search for any method with these patterns: | ||
> - `resolve[FeatureName]` (camel case) | ||
> - `resolve_[feature_name]` (snake case) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
--- | ||
title: 'Feature Check' | ||
description: '' | ||
--- | ||
|
||
## Feature Check | ||
|
||
In code feature can be checked in multiple ways for the logged user: | ||
|
||
### Check if enabled | ||
|
||
```php | ||
if(AppFeature::multi_language->active()){ | ||
//.. multi language specific code | ||
} | ||
``` | ||
|
||
### Check if disabled | ||
|
||
```php | ||
if(AppFeature::multi_language->active()){ | ||
//.. multi language specific code | ||
} | ||
``` | ||
|
||
### Enforced | ||
|
||
```php | ||
|
||
AppFeature::impersonate->enforce(); //throws a 403 exception if not active | ||
|
||
``` | ||
|
||
## Feature Check for a given scope | ||
|
||
Each check can be applied to a scope different from the logged user: | ||
|
||
```php | ||
|
||
$user = User::find(42); | ||
|
||
if(AppFeature::multi_language->active($user)){ | ||
//.. multi language specific code | ||
} | ||
|
||
if(AppFeature::multi_language->active($user)){ | ||
//.. multi language specific code | ||
} | ||
|
||
AppFeature::impersonate->enforce($user); //throws a 403 exception if not active | ||
|
||
``` | ||
|
||
## Multiple feature checks | ||
|
||
This package can check for multiple feature at once as well: | ||
|
||
### All Active | ||
|
||
```php | ||
|
||
if(AppFeature::areAllActive([AppFeature::multi_language, AppFeature::welcome_email])){ | ||
//.. | ||
} | ||
|
||
``` | ||
|
||
### Some Active | ||
|
||
```php | ||
|
||
if(AppFeature::someAreActive([AppFeature::multi_language, AppFeature::welcome_email])){ | ||
//.. | ||
} | ||
|
||
``` | ||
|
||
### All Inactive | ||
|
||
```php | ||
|
||
if(AppFeature::areAllInactive([AppFeature::multi_language, AppFeature::welcome_email])){ | ||
//.. | ||
} | ||
|
||
``` | ||
|
||
### Some Inactive | ||
|
||
```php | ||
|
||
if(AppFeature::someAreInactive([AppFeature::multi_language, AppFeature::welcome_email])){ | ||
//.. | ||
} | ||
|
||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
--- | ||
title: 'Updating Values' | ||
description: '' | ||
--- | ||
|
||
## Updating Values | ||
|
||
Laravel Pennant stores the value resolved for a given scope, in order to change the stored value this package offers some useful methods: | ||
|
||
### Activate a feature | ||
|
||
```php | ||
AppFeature::multi_language->activate(); | ||
|
||
//also for a given scope | ||
AppFeature::multi_language->activate($user); | ||
``` | ||
|
||
### Deactivate a feature | ||
|
||
```php | ||
AppFeature::multi_language->deactivate(); | ||
|
||
//also for a given scope | ||
AppFeature::multi_language->deactivate($user); | ||
``` | ||
|
||
### Forget stored value | ||
|
||
```php | ||
AppFeature::multi_language->forget(); | ||
|
||
//also for a given scope | ||
AppFeature::multi_language->forget($user); | ||
``` | ||
|
||
### Forget for all scopes | ||
|
||
```php | ||
AppFeature::multi_language->purge(); | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
--- | ||
title: 'Blade Directive' | ||
description: '' | ||
--- | ||
|
||
## Blade Directive | ||
|
||
To help checking features in blade code, this package offers a `@feature` directive | ||
|
||
```html | ||
|
||
@feature(AppFeature::multi_language) | ||
<select name="language" xmlns="http://www.w3.org/1999/html"> | ||
<option value="en">English</option> | ||
<option value="fr">French</option> | ||
<option value="it">Italian</option> | ||
</select> | ||
@endfeature | ||
|
||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
--- | ||
title: 'Middleware' | ||
description: '' | ||
--- | ||
|
||
## Middleware | ||
|
||
Features can be enforced using Laravel Pennants [middlewares](https://laravel.com/docs/11.x/pennant#middleware) | ||
|
||
```php | ||
|
||
Route::get('/users/{user}/impersonate', function(){ | ||
// ... | ||
})->middleware(AppFeature::impersonate->middleware()); | ||
|
||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[replace:contributing] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[replace:releases] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[replace:changelog] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
--- | ||
title: Installation & Configuration | ||
menuTitle: 'Installation' | ||
--- | ||
|
||
You can install the package via composer: | ||
|
||
``` bash | ||
composer require defstudio/enum-features | ||
``` | ||
|
||
## Usage | ||
|
||
Features can be enabled on any enum by using the `DefinesFeatures` trait: | ||
|
||
```php | ||
use DefStudio\EnumFeatures\EnumFeatures; | ||
|
||
enum AppFeature | ||
{ | ||
use DefinesFeatures; // ← simply add this | ||
|
||
case multi_language; | ||
case impersonate; | ||
case welcome_email; | ||
|
||
/* And add your feature resolution code */ | ||
|
||
//with a single method: | ||
protected function resolve(Authenticatable $user = null) { | ||
match($this){ | ||
case self::multi_language => true, | ||
case self::impersonate => $user->isAdmin(), | ||
default => false; | ||
} | ||
} | ||
|
||
//or with a dedicated method: | ||
|
||
protected function resolveImpersonate(Authenticatable $user = null){ | ||
return $user->isSuperAdmin(); | ||
} | ||
} | ||
``` | ||
|
||
and just register the features in a ServiceProvider `boot()` method: | ||
|
||
```php | ||
class AppServiceProvider extends ServiceProvider | ||
{ | ||
//.. | ||
|
||
public function boot(): void { | ||
AppFeature::defineFeatures(); | ||
} | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[replace:issues] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[replace:support-us] |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.