enums
PHP backed string enums used instead of constants or magic strings. Enums include `label()` and `color()` helper methods and are cast on Eloquent models.
SKILL.mdresources/boost/skills/enums/SKILL.md
GitHubEnums
When to Use
- When a domain field has a closed set of values (status, type, category).
- When you want type safety, autocomplete, and safer refactors than raw strings.
- When values are stored in the database and cast on Eloquent models.
When NOT to Use
- For open-ended or user-defined values that can change at runtime.
- For free-text labels coming from external systems that are not a stable finite set.
Preconditions
- PHP version supports enums.
- Enum classes are placed in
app/Enums/. - Related Eloquent models cast enum-backed columns.
Rules
- Use backed string enums — never use plain constants or magic strings for finite sets of values
- Include
label(): stringandcolor(): stringhelper methods on every enum - Use
color()for UI color tokens (for example Tailwind tokens likegray,green,red) unless the consuming UI explicitly requires a different format - Place all enums in
app/Enums/ - Always cast enum columns in model
casts()methods - Use enum string values in migrations:
$table->string('status')->default('draft') - Reference enum cases in code, never raw strings:
Status::Draftnot'draft' - Use
matchexpressions inlabel()andcolor()— never if/else chains - Enum naming:
PascalCasefor enum classes andPascalCasefor cases (Status::Draft)
Examples
enum Status: string
{
case Draft = 'draft';
case Active = 'active';
case Archived = 'archived';
public function label(): string
{
return match ($this) {
self::Draft => 'Draft',
self::Active => 'Active',
self::Archived => 'Archived',
};
}
public function color(): string
{
return match ($this) {
self::Draft => 'gray',
self::Active => 'green',
self::Archived => 'red',
};
}
}
// Model cast
protected function casts(): array
{
return [
'status' => Status::class,
];
}
// Usage
if ($invoice->status === Status::Draft) { ... }
echo $invoice->status->label(); // 'Draft'
Anti-Patterns
- Using raw strings instead of enum cases:
'draft'instead ofStatus::Draft - Using integer-backed enums when string enums are more readable
- Forgetting to cast enum columns in the model's
casts()method - Using if/else chains instead of
matchexpressions inlabel()orcolor() - Putting business logic inside enum methods (beyond label/color presentation helpers)
- Using enums for values that are dynamic, user-generated, or frequently changing
References
- PHP Enums
- Laravel Enum Casting
- Related:
Models/SKILL.md— for how enums are cast in Eloquent models