bitmask-development

📁 dotgksh/transistor 📅 2 days ago
2
总安装量
2
周安装量
#75003
全站排名
安装命令
npx skills add https://github.com/dotgksh/transistor --skill bitmask-development

Agent 安装分布

amp 2
gemini-cli 2
github-copilot 2
codex 2
kimi-cli 2
cursor 2

Skill 文档

Bitmask Development with Transistor

When to Use This Skill

Activate when:

  • Creating or modifying bitmask flag enums
  • Setting up models with bitmask columns
  • Writing queries that filter by bitmask flags
  • Adding validation for bitmask inputs
  • Using bitmask conditionals in Blade templates

Creating Bitmask Flag Enums

Use php artisan make:bitmask-flags to generate enums interactively. The command will prompt for flag names.

Flags use bit-shifted values:

  • Flag 1: 1 << 0 (1)
  • Flag 2: 1 << 1 (2)
  • Flag 3: 1 << 2 (4)
  • Flag 4: 1 << 3 (8)

Example enum:

enum Permission: int
{
    case Read = 1 << 0;    // 1
    case Write = 1 << 1;   // 2
    case Delete = 1 << 2;  // 4
    case Admin = 1 << 3;   // 8
}

Model Configuration

Add the trait and cast to your model:

use Gksh\Transistor\Casts\BitmaskCast;
use Gksh\Transistor\Concerns\HasBitmaskScopes;

class User extends Model
{
    use HasBitmaskScopes;

    protected function casts(): array
    {
        return [
            'permissions' => BitmaskCast::class,
            // Or specify size: BitmaskCast::class.':tiny'
        ];
    }
}

Cast size options: tiny, small, medium, or default (32-bit).

Migration Examples

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->bitmask('permissions');        // 32-bit unsigned integer, default 0
    $table->tinyBitmask('settings');       // 8-bit (up to 8 flags)
    $table->smallBitmask('preferences');   // 16-bit (up to 16 flags)
    $table->mediumBitmask('features');     // 24-bit (up to 24 flags)
});

Query Scope Examples

Filter records by bitmask flags:

// Has a specific flag
User::whereHasBitmaskFlag('permissions', Permission::Admin)->get();

// Has ALL specified flags
User::whereHasAllBitmaskFlags('permissions', [Permission::Read, Permission::Write])->get();

// Has ANY of the specified flags
User::whereHasAnyBitmaskFlag('permissions', [Permission::Admin, Permission::Delete])->get();

// Does NOT have a specific flag
User::whereDoesntHaveBitmaskFlag('permissions', Permission::Admin)->get();

// Does NOT have ANY of the specified flags
User::whereDoesntHaveAnyBitmaskFlag('permissions', [Permission::Admin, Permission::Delete])->get();

Validation Examples

In a Form Request:

use Gksh\Transistor\Rules\ValidBitmask;

public function rules(): array
{
    return [
        // Basic validation (any non-negative integer)
        'permissions' => ['required', new ValidBitmask],

        // With enum constraint (validates against max possible value)
        'permissions' => ['required', new ValidBitmask(Permission::class)],

        // Using inline rule syntax
        'permissions' => ['required', 'bitmask:'.Permission::class],
    ];
}

Blade Directive Examples

Check flags in Blade templates:

@hasBitmaskFlag($user->permissions, Permission::Admin)
    <p>User is an admin</p>
@endhasBitmaskFlag

@hasAnyBitmaskFlag($user->permissions, [Permission::Read, Permission::Write])
    <p>User can read or write</p>
@endhasAnyBitmaskFlag

@hasAllBitmaskFlags($user->permissions, [Permission::Read, Permission::Write])
    <p>User can read AND write</p>
@endhasAllBitmaskFlags

Inspecting Bitmask Values

Use the inspect command to visualize flags:

# Show all flags for an enum
php artisan bitmask:inspect Permission

# Analyze a specific value
php artisan bitmask:inspect Permission 7

This displays a table with case names, decimal values, and binary representation with colored bits.

Working with Bitmask Objects

The cast returns a Gksh\Bitmask\Bitmask object:

$user = User::find(1);

// Check if a flag is set
$user->permissions->has(Permission::Admin);

// Get the integer value
$user->permissions->value();