emreyarligan / enum-concern
A PHP package for effortless Enumeration handling with Laravel Collections π¦ β¨
Installs: 27 773
Dependents: 0
Suggesters: 0
Security: 0
Stars: 212
Watchers: 3
Forks: 6
Open Issues: 0
Requires
- php: >=8.1
- illuminate/collections: ^8.65 || ^9.0 || ^10.0 || ^11.0
Requires (Dev)
- phpunit/phpunit: ^10.0
README
EnumConcern is a PHP package designed to enhance the usage of PHP's Enum feature with a set of convenient methods. This package includes a Trait file that enables easy handling of Enums.
Powered by Laravel Collections to make you feel at home. π§‘
Installation
To install EnumConcern package, require it via composer:
composer require emreyarligan/enum-concern
Now, you can use EnumConcern in your Enums.
namespace App\Enums; use EmreYarligan\EnumConcern\EnumConcern; enum TestEnum: string { use EnumConcern; ... ... }
Methods
Basic Usage
You can check the Examples with All Methods section at the bellow of the document for more details.
namespace App\Enums; use EmreYarligan\EnumConcern\EnumConcern; enum Color: string { use EnumConcern; case RED = "Red"; case GREEN = "Green"; case BLUE = "Blue"; public function translateToTurkish(): string { return match ($this) { self::RED => 'KΔ±rmΔ±zΔ±', self::GREEN => 'YeΕil', self::BLUE => 'Mavi', }; } } Color::all(); // Result: Illuminate\Support\Collection (7) [ // [0] => 'Red', // [1] => 'Green', // [2] => 'Blue // ] Color::all('translateToTurkish'); // Result: Illuminate\Support\Collection (7) [ // [0] => 'KΔ±rmΔ±zΔ±', // [1] => 'YeΕil', // [2] => 'Mavi // ] Color::has('Purple'); // false Color::has('Mavi','translateToTurkish'); // true
Examples With All Methods
Step 1: Create Your Enum
Create an Enum class and uses the EnumConcern Trait.
Here's an example for this paper. I created a trait about fruits for the example, isn't it ingenious? π
namespace App\Enums; use EmreYarligan\EnumConcern\EnumConcern; enum Fruits: int { use EnumConcern; case BANANA = 1; case STRAWBERRY = 2; case CHERRY = 3; case WATERMELON = 4; case ORANGE = 5; case KIWI = 6; case APPLE = 7; // Custom methods public function emojis(): string { return match ($this) { self::BANANA => 'π', self::STRAWBERRY => 'π', self::CHERRY => 'π', self::WATERMELON => 'π', self::ORANGE => 'π', self::KIWI => 'π₯', self::APPLE => 'π', }; } public function names(): string { return match ($this) { self::BANANA => 'Banana', self::STRAWBERRY => 'Strawberry', self::CHERRY => 'Cherry', self::WATERMELON => 'Watermelon', self::ORANGE => 'Orange', self::KIWI => 'Kiwi', self::APPLE => 'Apple', }; } }
Note: This README includes examples that are valid for both int
and string
types of Enum values. The EnumConcern Trait handles both types of Enum values in the same way. This allows you to use the EnumConcern Trait for both types of Enum in your project and facilitate the handling of Enum values.
Here's string Enum example:
namespace App\Enums; use EmreYarligan\EnumConcern\EnumConcern; enum Fruits: string { use EnumConcern; case BANANA = "Delicious Banana"; case STRAWBERRY = 'Red Strawberry'; case CHERRY = "Sweet Cherry"; case WATERMELON = "juicy watermelon"; case ORANGE = "Tasty Orange"; case KIWI = "Green Kiwi"; case APPLE = "Crunchy Apple"; }
Step 2: Enum Handling with EnumConcern
EnumConcern provides several convenient methods to handle your Enum values.
all() Method
Get all the Enum values as a Collection (empty $method)
Fruits::all();
Result:
Illuminate\Support\Collection {
#items: array:7 [
"BANANA" => 1
"STRAWBERRY" => 2
"CHERRY" => 3
"WATERMELON" => 4
"ORANGE" => 5
"KIWI" => 6
"APPLE" => 7
]
}
Get all the Enum values as a Collection using 'emojis' method
Fruits::all('emojis');
Result:
Illuminate\Support\Collection {
#items: array:7 [
"BANANA" => "π"
"STRAWBERRY" => "π"
"CHERRY" => "π"
"WATERMELON" => "π"
"ORANGE" => "π"
"KIWI" => "π₯"
"APPLE" => "π"
]
}
Get all the Enum values as a Collection using 'names' method.
Fruits::all('names');
Result:
Illuminate\Support\Collection {
#items: array:7 [
"BANANA" => "Banana"
"STRAWBERRY" => "Strawberry"
"CHERRY" => "Cherry"
"WATERMELON" => "Watermelon"
"ORANGE" => "Orange"
"KIWI" => "Kiwi"
"APPLE" => "Apple"
]
}
has() method
Check if a specific value exists (empty $method)
Fruits::has(1); // Result: true
Check if a specific value exists using 'emojis' method
Fruits::has('π', 'emojis'); // Result: true
Check if a specific value exists using 'names' method
Fruits::has('Coconut', 'names'); // Result: false
keyByValue() method
Get the case (key / name) for a specific value (empty $method)
Fruits::keyByValue(3); // Result: "CHERRY"
Get the case (key / name) for a specific value using 'emojis' method
Fruits::keyByValue('π₯', 'emojis'); // Result: "KIWI"
Get the case (key / name) for a specific value using 'names' method
Fruits::keyByValue('Orange', 'names'); // Result: "ORANGE"
toJson() method
Convert all the values to a JSON string (empty $method)
Fruits::toJson(); // Result: "{"BANANA":1,"STRAWBERRY":2,"CHERRY":3,"WATERMELON":4,"ORANGE":5,"KIWI":6,"APPLE":7}"
Convert all the values to a JSON string using 'emojis' method
Fruits::toJson('emojis',JSON_UNESCAPED_UNICODE); // Result: "{"BANANA":"π","STRAWBERRY":"π",...,"APPLE":"π"}"
Convert all the values to a JSON string using 'names' method
Fruits::toJson('names'); // Result: "{"BANANA":"Banana","STRAWBERRY":"Strawberry","CHERRY":"Cherry","WATERMELON":"Watermelon","ORANGE":"Orange","KIWI":"Kiwi","APPLE":"Apple"}"
toArray() method
Convert all the values to an array (empty $method)
Fruits::toArray();
Result:
array:7 [
"BANANA" => 1
"STRAWBERRY" => 2
"CHERRY" => 3
"WATERMELON" => 4
"ORANGE" => 5
"KIWI" => 6
"APPLE" => 7
]
Convert all the values to an array using 'emojis' method
Fruits::toArray('emojis');
Result:
array:7 [
"BANANA" => "π"
"STRAWBERRY" => "π"
"CHERRY" => "π"
"WATERMELON" => "π"
"ORANGE" => "π"
"KIWI" => "π₯"
"APPLE" => "π"
]
Convert all the values to an array using 'names' method
Fruits::toArray('names');
Result:
array:7 [
"BANANA" => "Banana"
"STRAWBERRY" => "Strawberry"
"CHERRY" => "Cherry"
"WATERMELON" => "Watermelon"
"ORANGE" => "Orange"
"KIWI" => "Kiwi"
"APPLE" => "Apple"
]
toKeyValueCollection() method
Convert all the values to a key-value format as a Collection (empty $method)
Fruits::toKeyValueCollection();
Result:
Illuminate\Support\Collection {
#items: array:7 [
"BANANA" => array:2 [
"key" => "BANANA"
"value" => 1
]
"STRAWBERRY" => array:2 [
"key" => "STRAWBERRY"
"value" => 2
]
"CHERRY" => array:2 [
"key" => "CHERRY"
"value" => 3
]
"WATERMELON" => array:2 [
"key" => "WATERMELON"
"value" => 4
]
"ORANGE" => array:2 [
"key" => "ORANGE"
"value" => 5
]
"KIWI" => array:2 [
"key" => "KIWI"
"value" => 6
]
"APPLE" => array:2 [
"key" => "APPLE"
"value" => 7
]
]
}
Convert all the values to a key-value format as a Collection with keyAttributeName and valueAttributeName parameters (empty $method)
Fruits::toKeyValueCollection(keyAttributeName: 'foo', valueAttributeName: 'bar');
Result:
Illuminate\Support\Collection {
#items: array:7 [
"BANANA" => array:2 [
"foo" => "BANANA"
"bar" => 1
]
"STRAWBERRY" => array:2 [
"foo" => "STRAWBERRY"
"bar" => 2
]
"CHERRY" => array:2 [
"foo" => "CHERRY"
"bar" => 3
]
"WATERMELON" => array:2 [
"foo" => "WATERMELON"
"bar" => 4
]
"ORANGE" => array:2 [
"foo" => "ORANGE"
"bar" => 5
]
"KIWI" => array:2 [
"foo" => "KIWI"
"bar" => 6
]
"APPLE" => array:2 [
"foo" => "APPLE"
"bar" => 7
]
]
}
Convert all the values to a key-value format as a Collection using 'emojis' method
Fruits::toKeyValueCollection('emojis');
Result:
Illuminate\Support\Collection {
#items: array:7 [
"BANANA" => array:2 [
"key" => "BANANA"
"value" => "π"
]
"STRAWBERRY" => array:2 [
"key" => "STRAWBERRY"
"value" => "π"
]
"CHERRY" => array:2 [
"key" => "CHERRY"
"value" => "π"
]
"WATERMELON" => array:2 [
"key" => "WATERMELON"
"value" => "π"
]
"ORANGE" => array:2 [
"key" => "ORANGE"
"value" => "π"
]
"KIWI" => array:2 [
"key" => "KIWI"
"value" => "π₯"
]
"APPLE" => array:2 [
"key" => "APPLE"
"value" => "π"
]
]
}
Convert all the values to a key-value format as a Collection using 'emojis' method with keyAttributeName and valueAttributeName parameters
Fruits::toKeyValueCollection('emojis','foo','bar');
Result:
Illuminate\Support\Collection {
#items: array:7 [
"BANANA" => array:2 [
"foo" => "BANANA"
"bar" => "π"
]
"STRAWBERRY" => array:2 [
"foo" => "STRAWBERRY"
"bar" => "π"
]
"CHERRY" => array:2 [
"foo" => "CHERRY"
"bar" => "π"
]
"WATERMELON" => array:2 [
"foo" => "WATERMELON"
"bar" => "π"
]
"ORANGE" => array:2 [
"foo" => "ORANGE"
"bar" => "π"
]
"KIWI" => array:2 [
"foo" => "KIWI"
"bar" => "π₯"
]
"APPLE" => array:2 [
"foo" => "APPLE"
"bar" => "π"
]
]
}
Convert all the values to a key-value format as a Collection using 'names' method
Fruits::toKeyValueCollection('names');
Result:
Illuminate\Support\Collection {
#items: array:7 [
"BANANA" => array:2 [
"key" => "BANANA"
"value" => "Banana"
]
"STRAWBERRY" => array:2 [
"key" => "STRAWBERRY"
"value" => "Strawberry"
]
"CHERRY" => array:2 [
"key" => "CHERRY"
"value" => "Cherry"
]
"WATERMELON" => array:2 [
"key" => "WATERMELON"
"value" => "Watermelon"
]
"ORANGE" => array:2 [
"key" => "ORANGE"
"value" => "Orange"
]
"KIWI" => array:2 [
"key" => "KIWI"
"value" => "Kiwi"
]
"APPLE" => array:2 [
"key" => "APPLE"
"value" => "Apple"
]
]
}
Convert all the values to a key-value format as a Collection using 'names' method with keyAttributeName and valueAttributeName parameters.
Fruits::toKeyValueCollection('names', 'foo', 'bar');
Result:
Illuminate\Support\Collection {
#items: array:7 [
"BANANA" => array:2 [
"foo" => "BANANA"
"bar" => "Banana"
]
"STRAWBERRY" => array:2 [
"foo" => "STRAWBERRY"
"bar" => "Strawberry"
]
"CHERRY" => array:2 [
"foo" => "CHERRY"
"bar" => "Cherry"
]
"WATERMELON" => array:2 [
"foo" => "WATERMELON"
"bar" => "Watermelon"
]
"ORANGE" => array:2 [
"foo" => "ORANGE"
"bar" => "Orange"
]
"KIWI" => array:2 [
"foo" => "KIWI"
"bar" => "Kiwi"
]
"APPLE" => array:2 [
"foo" => "APPLE"
"bar" => "Apple"
]
]
}
toKeyValueArray() method
Convert all the values to a key-value format as an array (empty $method)
Fruits::toKeyValueArray();
Result:
array:7 [
0 => array:2 [
"key" => "BANANA"
"value" => 1
]
1 => array:2 [
"key" => "STRAWBERRY"
"value" => 2
]
2 => array:2 [
"key" => "CHERRY"
"value" => 3
]
3 => array:2 [
"key" => "WATERMELON"
"value" => 4
]
4 => array:2 [
"key" => "ORANGE"
"value" => 5
]
5 => array:2 [
"key" => "KIWI"
"value" => 6
]
6 => array:2 [
"key" => "APPLE"
"value" => 7
]
]
Convert all the values to a key-value format as an array with keyAttributeName and valueAttributeName parameters (empty $method)
Fruits::toKeyValueArray(keyAttributeName: 'foo', valueAttributeName: 'bar');
Result:
array:7 [
0 => array:2 [
"foo" => "BANANA"
"bar" => 1
]
1 => array:2 [
"foo" => "STRAWBERRY"
"bar" => 2
]
2 => array:2 [
"foo" => "CHERRY"
"bar" => 3
]
3 => array:2 [
"foo" => "WATERMELON"
"bar" => 4
]
4 => array:2 [
"foo" => "ORANGE"
"bar" => 5
]
5 => array:2 [
"foo" => "KIWI"
"bar" => 6
]
6 => array:2 [
"foo" => "APPLE"
"bar" => 7
]
]
Convert all the values to a key-value format as an array using 'emojis' method
Fruits::toKeyValueArray('emojis');
Result:
array:7 [
0 => array:2 [
"key" => "BANANA"
"value" => "π"
]
1 => array:2 [
"key" => "STRAWBERRY"
"value" => "π"
]
2 => array:2 [
"key" => "CHERRY"
"value" => "π"
]
3 => array:2 [
"key" => "WATERMELON"
"value" => "π"
]
4 => array:2 [
"key" => "ORANGE"
"value" => "π"
]
5 => array:2 [
"key" => "KIWI"
"value" => "π₯"
]
6 => array:2 [
"key" => "APPLE"
"value" => "π"
]
]
Convert all the values to a key-value format as an array using 'emojis' method with keyAttributeName and valueAttributeName parameters (empty $method)
Fruits::toKeyValueArray('emojis','foo','bar');
Result:
array:7 [
0 => array:2 [
"foo" => "BANANA"
"bar" => "π"
]
1 => array:2 [
"foo" => "STRAWBERRY"
"bar" => "π"
]
2 => array:2 [
"foo" => "CHERRY"
"bar" => "π"
]
3 => array:2 [
"foo" => "WATERMELON"
"bar" => "π"
]
4 => array:2 [
"foo" => "ORANGE"
"bar" => "π"
]
5 => array:2 [
"foo" => "KIWI"
"bar" => "π₯"
]
6 => array:2 [
"foo" => "APPLE"
"bar" => "π"
]
]
Convert all the values to a key-value format as an array using 'names' method
Fruits::toKeyValueArray('names');
Result:
array:7 [
0 => array:2 [
"key" => "BANANA"
"value" => "Banana"
]
1 => array:2 [
"key" => "STRAWBERRY"
"value" => "Strawberry"
]
2 => array:2 [
"key" => "CHERRY"
"value" => "Cherry"
]
3 => array:2 [
"key" => "WATERMELON"
"value" => "Watermelon"
]
4 => array:2 [
"key" => "ORANGE"
"value" => "Orange"
]
5 => array:2 [
"key" => "KIWI"
"value" => "Kiwi"
]
6 => array:2 [
"key" => "APPLE"
"value" => "Apple"
]
]
Convert all the values to a key-value format as an array using 'names' method with keyAttributeName and valueAttributeName parameters (empty $method)
Fruits::toKeyValueArray('names','foo','bar');
Result:
array:7 [
0 => array:2 [
"foo" => "BANANA"
"bar" => "Banana"
]
1 => array:2 [
"foo" => "STRAWBERRY"
"bar" => "Strawberry"
]
2 => array:2 [
"foo" => "CHERRY"
"bar" => "Cherry"
]
3 => array:2 [
"foo" => "WATERMELON"
"bar" => "Watermelon"
]
4 => array:2 [
"foo" => "ORANGE"
"bar" => "Orange"
]
5 => array:2 [
"foo" => "KIWI"
"bar" => "Kiwi"
]
6 => array:2 [
"foo" => "APPLE"
"bar" => "Apple"
]
]
randomValue() method
Get a random value from the collection of values (empty $method)
Fruits::randomValue(); // Result: int(4)
Get a random value from the collection of values using 'emojis' method
Fruits::randomValue('emojis'); // Result: string(4) "π"
Get a random value from the collection of values using 'names' method
Fruits::randomValue('names'); // Result: string(6) "Kiwi"
randomKey() method
Get a random case (key / name) from the collection of values
Fruits::randomKey(); // Result: string(7) "KIWI"
only() Method
Get values of only certain keys as a Collection (empty $method)
Fruits::only(['STRAWBERRY','CHERRY','WATERMELON','ORANGE']);
Result:
Illuminate\Support\Collection {
#items: array:4 [
"STRAWBERRY" => 2
"CHERRY" => 3
"WATERMELON" => 4
"ORANGE" => 5
]
}
Get values of only certain keys as a Collection using 'emojis' method
Fruits::only(['STRAWBERRY','CHERRY','WATERMELON','ORANGE'],'emojis');
Result:
Illuminate\Support\Collection {
#items: array:4 [
"STRAWBERRY" => "π"
"CHERRY" => "π"
"WATERMELON" => "π"
"ORANGE" => "π"
]
}
Get values of only certain keys as a Collection using 'names' method
Fruits::only(['STRAWBERRY','CHERRY','WATERMELON','ORANGE'],'names');
Result:
Illuminate\Support\Collection {
#items: array:4 [
"STRAWBERRY" => "Strawberry"
"CHERRY" => "Cherry"
"WATERMELON" => "Watermelon"
"ORANGE" => "Orange"
]
}
onlyAsArray() Method
Get values of only certain keys as an array (empty $method)
Fruits::onlyAsArray(['STRAWBERRY','CHERRY','WATERMELON','ORANGE']);
Result:
array:4 [
"STRAWBERRY" => 2
"CHERRY" => 3
"WATERMELON" => 4
"ORANGE" => 5
]
Get values of only certain keys as an array using 'emojis' method
Fruits::onlyAsArray(['STRAWBERRY','CHERRY','WATERMELON','ORANGE'],'emojis');
Result:
array:4 [
"STRAWBERRY" => "π"
"CHERRY" => "π"
"WATERMELON" => "π"
"ORANGE" => "π"
]
Get values of only certain keys as an array using 'names' method
Fruits::onlyAsArray(['STRAWBERRY','CHERRY','WATERMELON','ORANGE'],'names');
Result:
array:4 [
"STRAWBERRY" => "Strawberry"
"CHERRY" => "Cherry"
"WATERMELON" => "Watermelon"
"ORANGE" => "Orange"
]
except() Method
Get all values except certain keys as a Collection (empty $method)
Fruits::except(['STRAWBERRY','CHERRY','WATERMELON','ORANGE']);
Result:
Illuminate\Support\Collection {
#items: array:3 [
"BANANA" => 1
"KIWI" => 6
"APPLE" => 7
]
}
Get all values except certain keys a Collection using 'emojis' method
Fruits::except(['STRAWBERRY','CHERRY','WATERMELON','ORANGE'],'emojis');
Result:
Illuminate\Support\Collection {
#items: array:3 [
"BANANA" => "π"
"KIWI" => "π₯"
"APPLE" => "π"
]
}
Get all values except certain keys a Collection using 'names' method
Fruits::except(['STRAWBERRY','CHERRY','WATERMELON','ORANGE'],'names');
Result:
Illuminate\Support\Collection {
#items: array:3 [
"BANANA" => "Banana"
"KIWI" => "Kiwi"
"APPLE" => "Apple"
]
}
exceptAsArray() Method
Get all values except certain keys as an array (empty $method)
Fruits::exceptAsArray(['STRAWBERRY','CHERRY','WATERMELON','ORANGE'])
Result:
array:3 [
"BANANA" => 1
"KIWI" => 6
"APPLE" => 7
]
Get all values except certain keys an array using 'emojis' method
Fruits::exceptAsArray(['STRAWBERRY','CHERRY','WATERMELON','ORANGE'],'emojis');
Result:
array:3 [
"BANANA" => "π"
"KIWI" => "π₯"
"APPLE" => "π"
]
Get all values except certain keys an array using 'names' method
Fruits::exceptAsArray(['STRAWBERRY','CHERRY','WATERMELON','ORANGE'],'names');
Result:
array:3 [
"BANANA" => "Banana"
"KIWI" => "Kiwi"
"APPLE" => "Apple"
]
first() Method
Get the first value from the Enum (empty $method)
Fruits::first(); // Result: int(1)
Get the first value from the Enum using 'emojis' method
Fruits::first('emojis'); // Result: "π"
Get the first value from the Enum using 'names' method
Fruits::first('names'); // Result: "Banana"
last() Method
Get the last value from the Enum (empty $method)
Fruits::last(); // Result: 7
Get the last value from the Enum using 'emojis' method
Fruits::last('emojis'); // Result: "π"
Get the last value from the Enum using 'names' method
Fruits::last('names'); // Result: "Apple"
fromValue() Method
Create an Enum object from a string value.
$greenEnum = Color::fromValue("Green"); // Result: // App\Enums\Color { // +name: "GREEN" // +value: "Green" // }
If the value "Green" exists in the Color
Enum, this method will return the corresponding Enum object. If not, it will throw an InvalidArgumentException
.
valueNamePairs() Method
Get the key-value pairs of value and transformed value (if a method is specified).
$pairs = Color::valueNamePairs('translateToTurkish'); // Result: // Illuminate\Support\Collection { // "Red" => "KΔ±rmΔ±zΔ±", // "Green" => "YeΕil", // "Blue" => "Mavi" // }
is() Method
Checks if the Enum value is equal to the given value.
$enum = Fruits::BANANA; $enum->is(Fruits::BANANA); // Result: true $enum->is(Fruits::APPLE); // Result: false
isNot() Method
Checks if the Enum value is not equal to the given value.
$enum = Fruits::BANANA; $enum->isNot(Fruits::BANANA); // Result: false $enum->isNot(Fruits::APPLE); // Result: true
isAny() Method
Checks if the Enum value is equal to any of the given values.
$enum = Fruits::BANANA; $enum->isAny(Fruits::BANANA, Fruits::APPLE); // Result: true $enum->isAny(Fruits::APPLE, Fruits::KIWI); // Result: false
isNotAny() Method
Checks if the Enum value is not equal to any of the given values.
$enum = Fruits::BANANA; $enum->isNotAny(Fruits::BANANA, Fruits::APPLE); // Result: false $enum->isNotAny(Fruits::APPLE, Fruits::KIWI); // Result: true
Tests
composer test