oskarstark/enum-helper
Helpers for PHP 8.1+ enums: compare enum cases (equals, notEquals, equalsOneOf) and convert enums to arrays (backed and non-backed). Includes an abstract EnumTestCase to simplify testing enum behavior.
Installation:
composer require oskarstark/enum-helper
First Use Case:
Create an enum with the Comparable and ToArray traits:
// app/Enums/UserRole.php
namespace App\Enums;
use OskarStark\Enum\Trait\Comparable;
use OskarStark\Enum\Trait\ToArray;
enum UserRole: string
{
use Comparable, ToArray;
case ADMIN = 'admin';
case EDITOR = 'editor';
case VIEWER = 'viewer';
}
Basic Usage:
// Compare enums
UserRole::ADMIN->equals(UserRole::EDITOR); // false
// Convert to array
UserRole::toArray(); // ['ADMIN' => 'admin', 'EDITOR' => 'editor', ...]
Comparable (for comparisons) and ToArray (for serialization).OskarStark\Enum\Test\EnumTestCase for consistent enum testing.if ($role->equals(UserRole::ADMIN)) {
// Grant admin access
}
if ($role->notEquals(UserRole::VIEWER)) {
// Allow editing
}
if ($role->equalsOneOf([UserRole::ADMIN, UserRole::EDITOR])) {
// Allow privileged actions
}
$rolesArray = UserRole::toArray();
// ['ADMIN' => 'admin', 'EDITOR' => 'editor', ...]
enum Status { ACTIVE, INACTIVE }
Status::toArray(); // ['ACTIVE' => 'ACTIVE', 'INACTIVE' => 'INACTIVE']
Combine traits with custom logic:
enum UserRole: string
{
use Comparable, ToArray;
case ADMIN = 'admin';
case EDITOR = 'editor';
public function canManageUsers(): bool
{
return $this->equals(self::ADMIN);
}
}
Extend EnumTestCase for consistent tests:
use OskarStark\Enum\Test\EnumTestCase;
class UserRoleTest extends EnumTestCase
{
protected function getEnum(): string
{
return UserRole::class;
}
public function testCanManageUsers()
{
$this->assertTrue(UserRole::ADMIN->canManageUsers());
$this->assertFalse(UserRole::EDITOR->canManageUsers());
}
}
Form Request Validation:
public function rules()
{
return [
'role' => ['required', Rule::in(array_column(UserRole::toArray(), 'value'))],
];
}
API Responses:
return response()->json([
'roles' => UserRole::toArray(),
]);
Authorization:
public function authorize()
{
return $this->user()->role()->equalsOneOf([
UserRole::ADMIN,
UserRole::EDITOR,
]);
}
Database Seeders:
UserRole::cases(); // Get all enum cases
toArray() results if called frequently in performance-critical paths.equalsOneOf() for bulk checks to avoid nested conditionals.Backed vs. Non-Backed Enums:
toArray() behaves differently for backed (UserRole::toArray() returns ['ADMIN' => 'admin']) vs. non-backed enums (Status::toArray() returns ['ACTIVE' => 'ACTIVE']).Type Safety:
equalsOneOf() accepts an array but may cause type errors if passed non-enum values.array_map(fn($case) => UserRole::from($case), $array) to ensure type safety.PHP 8.1+ Requirement:
config.php in Laravel if using older versions.Trait Conflicts:
Spatie\Enum\Enum).Static Analysis:
equalsOneOf().// phpstan.neon
parameters:
level: max
IDE Support:
Testing Edge Cases:
equalsOneOf() with empty arrays or null values:
$role->equalsOneOf([]); // Should return false
Custom Comparison Logic:
Extend the Comparable trait for custom rules:
use OskarStark\Enum\Trait\Comparable;
trait CustomComparable
{
public function isPremium(): bool
{
return $this->equals(self::PREMIUM);
}
}
Dynamic Array Conversion:
Override toArray() for custom serialization:
public function toArray(): array
{
return array_map(
fn($case) => ['value' => $case->value, 'label' => ucfirst($case->value)],
self::cases()
);
}
Rector Integration: Use the included Rector rules to automate trait adoption:
vendor/bin/rector process src --dry-run
Autoloading:
Ensure OskarStark\Enum\* is autoloaded in composer.json:
"autoload": {
"psr-4": {
"OskarStark\\Enum\\": "vendor/oskarstark/enum-helper/src"
}
}
Testing Setup:
If using EnumTestCase, ensure your test suite includes:
use OskarStark\Enum\Test\EnumTestCase;
PHPUnit Version: The package drops support for PHPUnit 9. Ensure compatibility with your Laravel version:
composer require --dev phpunit/phpunit:^10
How can I help you explore Laravel packages today?