Open source
Enums for Laravel
composer require roundly-consulting/enums-for-laravelOverview
A single trait that gives your PHP enums the helpers every Laravel app ends up rewriting: readable, translatable labels — derived from the value or read from your own translation files; names, values and labels as collections; select-ready options and badge-ready presentations with a colour per case; lookups by name or label; a validation rule that never drifts; random picks; expressive comparisons and fluent conditional callbacks. Add RoundlyConsulting\Enums\Helpers to a backed or pure enum and you’re done — no service provider, config, migrations or commands. Native to Laravel — built on its own Collection, Str and translator — MIT-licensed, with no dependency beyond Laravel itself.
What you get
Readable, translatable labels
readable() and label() headline the backed value — hot-news becomes “Hot News” — or, with #[TranslatedLabels], read every label from your lang/<locale>/enums.php.
Names, values and labels
One call each for every case’s name, backed value or label, as Laravel Collections in declaration order.
Select-ready options
A value => label map for Blade selects, or typed EnumOption DTOs (value, label, name) for Inertia, Vue and React.
Colours for badges and chips
Implement HasColor and presentations() returns the value, translated label and colour of every case — ready for a status badge in any front end.
Case lookups
Resolve a case by name or label — strict from* variants throw, tryFrom* return null — plus hasName() and hasValue().
Validation that never drifts
validationRule() builds the in: rule from the current cases, so adding a case never breaks a form.
Comparisons and callbacks
is(), isNot(), isIn(), isNotIn() and fluent whenIs* callbacks with an optional default branch.
One trait, zero setup
No service provider, config, migrations, commands or facade. Works on backed and pure enums — pure enums use the case name wherever a value is read.
Documentation
Installation
Install with Composer — there is no service provider, config, migration or command to publish or register.
Quick start
Add the Helpers trait to an enum and get labels, options, lookups, validation and comparisons in one line.
Backed and pure enums
What each helper returns on string-backed, int-backed and pure enums — and where pure enums fall back to the case name.
Readable labels
readable() and label() turn a case into a human-friendly label with Str::headline(), passed through Laravel’s translator.
Translating labels
Localize labels with JSON translation files or a #[TranslatedLabels] group, or override readable() on the enum for full control.
Labels from translation files
#[TranslatedLabels] reads every label from a translation group such as lang/<locale>/enums.php, keeps the headline as fallback and lists missing lines.
Names, values and labels
names(), values(), storable(), labels(), collect() and count() — every case as a Collection, in declaration order.
Select options
toOptions() and toArray() build a value => label map for Blade selects, form components, JSON and API responses.
Front-end options
options() returns typed EnumOption DTOs — value, label and name — the shape JavaScript, Inertia, Vue and React selects expect.
Badge colours and presentation
Give each case a colour with HasColor; presentation() and presentations() return {value, label, color} DTOs for badges and status chips.
Case lookups
Resolve a case by name or readable label with fromName(), fromLabel() and their tryFrom* variants; check existence with hasName() and hasValue().
Validation
validationRule() builds a Laravel in: rule from values(), so the allow-list never drifts when cases change.
Equality checks
is(), isNot(), isIn() and isNotIn() compare cases by identity — readable conditions without manual === chains.
Conditional callbacks
whenIs(), whenIsNot(), whenIsIn() and whenIsNotIn() run a callback only when the condition matches, with an optional default.
Random cases & factories
random() picks a random case for model factories, seeders and demo data; collect() walks every case.
Exceptions
EnumException — thrown by lookups, random(), validationRule(), untranslated() and invalid label groups — extends InvalidArgumentException.
API reference
Every static and instance method the Helpers trait adds — signature, return type and purpose — plus the attribute, contract and DTOs.
Testing
Assert labels, options and validation in Pest, pin translations with untranslated(), add lines with Lang::addLines(), and run the package suite.
Requirements
PHP 8.4+ and Laravel 12 or 13 — no PHP extensions, no service provider, no config.
Show your open-source love
This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.
More ways to support, including cryptoBy donating, you agree to our donation terms.
Want this built into your product?
We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.