1
0
Fork 0
mirror of https://github.com/archtechx/enums.git synced 2025-12-12 09:44:03 +00:00
Helpers for making PHP enums more lovable.
Find a file
Samuel Levy a063814396 #4 Added From trait
This adds the `from()` and `tryFrom()` methods to pure enums, and the `fromName()` and `tryFromName()` methods for all enum types.
2022-03-13 16:09:32 +10:00
.github/workflows initial 2022-02-20 20:58:57 +01:00
src #4 Added From trait 2022-03-13 16:09:32 +10:00
tests #4 Added From trait 2022-03-13 16:09:32 +10:00
.gitattributes Initial commit 2022-02-20 19:51:56 +01:00
.gitignore Initial commit 2022-02-20 19:51:56 +01:00
.php-cs-fixer.php Initial commit 2022-02-20 19:51:56 +01:00
check remove docker call 2022-02-20 21:16:03 +01:00
composer.json wip 2022-02-20 21:10:21 +01:00
LICENSE Initial commit 2022-02-20 19:51:56 +01:00
phpstan.neon Initial commit 2022-02-20 19:51:56 +01:00
phpunit.xml Initial commit 2022-02-20 19:51:56 +01:00
README.md #4 Added From trait 2022-03-13 16:09:32 +10:00

Enums

A collection of enum helpers for PHP.

You can read more about the idea on Twitter. I originally wanted to include the InvokableCases helper in archtechx/helpers, but it makes more sense to make it a separate dependency and use it inside the other package.

Installation

PHP 8.1+ is required.

composer require archtechx/enums

Usage

InvokableCases

This helper lets you get the value of a backed enum by "invoking" it — either statically (MyEnum::FOO() instead of MyEnum::FOO), or as an instance ($enum()).

That way, you can use enums as array keys:

'statuses' => [
    TaskStatus::INCOMPLETE() => ['some configuration'],
    TaskStatus::COMPLETED() => ['some configuration'],
],

Or access the underlying primitives for any other use cases:

public function updateStatus(int $status): void;

$task->updateStatus(TaskStatus::COMPLETED());

The main point: this is all without having to append ->value to everything.

This approach also has decent IDE support. You get autosuggestions while typing, and then you just append ():

MyEnum::FOO; // => MyEnum instance
MyEnum::FOO(); // => 1

Apply the trait on your enum

use ArchTech\Enums\InvokableCases;

enum TaskStatus: int
{
    use InvokableCases;

    case INCOMPLETE = 0;
    case COMPLETED = 1;
    case CANCELED = 2;
}

Use static calls to get the primitive value

TaskStatus::INCOMPLETE(); // 0
TaskStatus::COMPLETED(); // 1
TaskStatus::CANCELED(); // 2

Invoke instances to get the primitive value

public function updateStatus(TaskStatus $status)
{
    $this->record->setStatus($status());
}

Names

This helper returns a list of case names in the enum.

Apply the trait on your enum

use ArchTech\Enums\Names;

enum TaskStatus: int
{
    use Names;

    case INCOMPLETE = 0;
    case COMPLETED = 1;
    case CANCELED = 2;
}

Use the names() method

TaskStatus::names(); // ['INCOMPLETE', 'COMPLETED', 'CANCELED']

Values

This helper returns a list of case values in the enum.

Apply the trait on your enum

use ArchTech\Enums\Values;

enum TaskStatus: int
{
    use Values;

    case INCOMPLETE = 0;
    case COMPLETED = 1;
    case CANCELED = 2;
}

Use the values() method

TaskStatus::values(); // [0, 1, 2]

Options

This helper returns an associative array of case names and values.

Apply the trait on your enum

use ArchTech\Enums\Options;

enum TaskStatus: int
{
    use Options;

    case INCOMPLETE = 0;
    case COMPLETED = 1;
    case CANCELED = 2;
}

Use the options() method

TaskStatus::options(); // ['INCOMPLETE' => 0, 'COMPLETED' => 1, 'CANCELED' => 2]

From

This helper adds from() and tryFrom() to pure enums, and adds fromName() and tryFromName() to all enums.

Important Notes:

  • BackedEnum instances already implement their own from() and tryFrom() methods, which will not be overridden by this trait. Attempting to override those methods in a BackedEnum causes a fatal error.
  • Pure enums do not actually have an internal index, so rearranging the order of cases will not break other code but it will create inconsistent behaviour with the from() and tryFrom() methods

Apply the trait on your enum

use ArchTech\Enums\From;

enum TaskStatus: int
{
    use From;

    case INCOMPLETE = 0;
    case COMPLETED = 1;
    case CANCELED = 2;
}

enum Role
{
    use From;
    
    case ADMINISTRATOR;
    case SUBSCRIBER;
    case GUEST;
}

Use the from() method

Role::from(0); // Role::ADMINISTRATOR
Role::from(5); // Error: \ValueError

Use the tryFrom() method

Role::tryFrom(2); // Role::GUEST
Role::tryFrom(5); // null

Use the fromName() method

TaskStatus::fromName('INCOMPLETE'); // TaskStatus::INCOMPLETE
Role::fromName('SUBSCRIBER'); // Role::SUBSCRIBER
TaskStatus::fromName('MISSING'); // Error: \ValueError
Role::fromName('HACKER'); // Error: \ValueError

Use the tryFromName() method

TaskStatus::tryFromName('COMPLETED'); // TaskStatus::COMPLETED
TaskStatus::tryFromName('NOTHING'); // null
Role::tryFromName('GUEST'); // Role::GUEST
Role::tryFromName('TESTER'); // null

Development

Run all checks locally:

./check

Code style will be automatically fixed by php-cs-fixer.