PHPackages                             din9xtr/laravel-enum-permissions - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. din9xtr/laravel-enum-permissions

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

din9xtr/laravel-enum-permissions
================================

Laravel permission management system using PHP Enums

1.1.0(2w ago)11MITPHPPHP ^8.3

Since Jan 21Pushed 5mo agoCompare

[ Source](https://github.com/din9xtr/laravel-enum-permissions)[ Packagist](https://packagist.org/packages/din9xtr/laravel-enum-permissions)[ Docs](https://github.com/din9xtr/laravel-enum-permissions)[ RSS](/packages/din9xtr-laravel-enum-permissions/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (10)Versions (3)Used By (0)

Laravel Enum Permissions
========================

[](#laravel-enum-permissions)

![PHP Version](https://camo.githubusercontent.com/89899a77bdce65fc4c3d3423dfacff9c6461066a0b5354dc18d7721c23ba596e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e332532422d626c75652e737667)[![License: MIT](https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667)](LICENSE)

Type-safe permission management system for Laravel models using PHP backed enums.

Installation
------------

[](#installation)

```
composer require din9xtr/laravel-enum-permissions
```

Storage formats
---------------

[](#storage-formats)

The package supports two storage formats:

- JSON: default and backward compatible with `PermissionsCast`.
- HEX: compact bitmask storage with `HexPermissionsCast`.

Existing users can keep `PermissionsCast::class` unchanged. New projects may choose HEX explicitly in the model cast.

Migrations
----------

[](#migrations)

### JSON

[](#json)

Use JSON when readability and direct database inspection matter.

```
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->json('permissions')->nullable();
        });
    }

    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('permissions');
        });
    }
};
```

JSON is stored as an object keyed by permission enum values:

```
{
    "create": true,
    "read": true,
    "update": false
}
```

### HEX

[](#hex)

Use HEX when compact storage is preferred.

```
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('permissions', 64)->nullable();
        });
    }

    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('permissions');
        });
    }
};
```

HEX is stored as a deterministic bitmask. Bit `0` maps to the first `PermissionEnum::cases()` item, bit `1` maps to the second item, and so on. For example, if `CREATE`, `READ`, and `EXPORT` are enabled, the stored value is `13`.

For HEX storage, the order of permission enum cases is part of the persisted data format. Append new permissions to the enum when possible. Reordering or inserting cases in the middle changes the meaning of existing stored HEX values and requires a data migration.

Enums
-----

[](#enums)

```
use Din9xtr\LaravelEnumPermissions\Contracts\PackagePermissionInterface;
use Din9xtr\LaravelEnumPermissions\Contracts\PermissionInterface;

enum PermissionEnum: string implements PermissionInterface
{
    case CREATE = 'create';
    case READ = 'read';
    case UPDATE = 'update';
    case DELETE = 'delete';
    case EXPORT = 'export';
    case IMPORT = 'import';

    public static function all(): array
    {
        return array_column(self::cases(), 'value');
    }

    public static function getPackagePermissions(PackagePermissionInterface $package): array
    {
        return match ($package) {
            PackageEnum::ADMIN => [
                self::CREATE,
                self::READ,
                self::UPDATE,
                self::DELETE,
                self::EXPORT,
                self::IMPORT,
            ],
            PackageEnum::EDITOR => [
                self::CREATE,
                self::READ,
                self::UPDATE,
                self::EXPORT,
            ],
            PackageEnum::VIEWER => [
                self::READ,
                self::EXPORT,
            ],
            PackageEnum::CUSTOM => [],
        };
    }
}
```

```
use Din9xtr\LaravelEnumPermissions\Contracts\PackagePermissionInterface;

enum PackageEnum: string implements PackagePermissionInterface
{
    case ADMIN = 'admin';
    case EDITOR = 'editor';
    case VIEWER = 'viewer';
    case CUSTOM = 'custom';
}
```

`PackageEnum` is optional unless you use `applyPackage()` or `detectPackage()`. When used with the trait, it must define a `CUSTOM` case.

Model configuration
-------------------

[](#model-configuration)

### JSON cast

[](#json-cast)

```
use Din9xtr\LaravelEnumPermissions\Casts\PermissionsCast;
use Din9xtr\LaravelEnumPermissions\Contracts\HasPackagePermissionEnum;
use Din9xtr\LaravelEnumPermissions\Contracts\HasPermissionEnum;
use Din9xtr\LaravelEnumPermissions\Traits\HasPermissionsTrait;
use Illuminate\Database\Eloquent\Model;

class User extends Model implements HasPermissionEnum, HasPackagePermissionEnum
{
    use HasPermissionsTrait;

    protected string $permissionsAttribute = 'permissions';

    protected $casts = [
        'permissions' => PermissionsCast::class,
    ];

    public static function permissionEnum(): string
    {
        return PermissionEnum::class;
    }

    public static function packageEnum(): string
    {
        return PackageEnum::class;
    }
}
```

### HEX cast

[](#hex-cast)

```
use Din9xtr\LaravelEnumPermissions\Casts\HexPermissionsCast;

protected $casts = [
    'permissions' => HexPermissionsCast::class,
];
```

Usage
-----

[](#usage)

```
$user = User::find(1);

if ($user->hasPermission(PermissionEnum::CREATE)) {
    // User can create.
}

$user->applyPackage(PackageEnum::ADMIN)->save();

$package = $user->detectPackage();
```

The cast returns a `PermissionsCollection`:

```
$permissions = $user->permissions;

$permissions->has(PermissionEnum::READ);
$permissions->enabled();
$permissions->toArray();
```

Compatibility and edge cases
----------------------------

[](#compatibility-and-edge-cases)

- `PermissionsCast` keeps the original JSON behavior and remains the default recommendation for existing projects.
- `HexPermissionsCast` is opt-in and does not read JSON values automatically.
- `null`, an empty JSON value, an empty HEX value, `0`, and `0x0` are treated as all permissions disabled.
- Unknown JSON permission keys are ignored on read and are not written back.
- HEX bits beyond the current enum cases are ignored on read and are not written back.
- Invalid HEX strings are treated as `0`.
- Missing known permissions are normalized to `false`.

Requirements
------------

[](#requirements)

- PHP 8.3 or higher
- Laravel 11.x components

Development
-----------

[](#development)

```
composer install
vendor/bin/pint
vendor/bin/phpstan analyse
vendor/bin/phpunit
composer validate
composer archive --format=zip
```

The Composer archive excludes tests and development tooling, so production installs receive only the library files and package metadata.

License
-------

[](#license)

This project is open-source and available under the [MIT License](LICENSE).

Copyright © 2026 Din9xtr

###  Health Score

35

—

LowBetter than 77% of packages

Maintenance72

Regular maintenance activity

Popularity3

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 80% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~146 days

Total

2

Last Release

17d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/177915132?v=4)[Andrew](/maintainers/din9xtr)[@din9xtr](https://github.com/din9xtr)

---

Top Contributors

[![din9xtr](https://avatars.githubusercontent.com/u/177915132?v=4)](https://github.com/din9xtr "din9xtr (4 commits)")[![FullstackNik](https://avatars.githubusercontent.com/u/141817124?v=4)](https://github.com/FullstackNik "FullstackNik (1 commits)")

---

Tags

laravelenumpermissions

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/din9xtr-laravel-enum-permissions/health.svg)

```
[![Health](https://phpackages.com/badges/din9xtr-laravel-enum-permissions/health.svg)](https://phpackages.com/packages/din9xtr-laravel-enum-permissions)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M346](/packages/psalm-plugin-laravel)[spatie/laravel-permission

Permission handling for Laravel 12 and up

12.9k102.4M1.4k](/packages/spatie-laravel-permission)[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M194](/packages/laravel-ai)[api-platform/laravel

API Platform support for Laravel

58171.4k14](/packages/api-platform-laravel)[illuminate/queue

The Illuminate Queue package.

21332.6M1.6k](/packages/illuminate-queue)[spatie/laravel-health

Monitor the health of a Laravel application

87512.0M165](/packages/spatie-laravel-health)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
