关于本文
我研究了在Laravel中使用Enum时要使用哪个软件包。
比较目标是以下三个。
- myclabs / PHP枚举
- BenSampo / Laravel-枚举
- 纳西罗夫/ laravel-enums
参考)SplEnum
以下将其描述为php-enum,laravel-enum,laravel-enums。
除了
php-enum,它是针对Laravel的,您可以使用
SplEnum被排除在外,因为它需要pecl,但是我希望它将很快作为标准提供。
结论
我认为php-enum会很好。
我对
laravel-enums不知所措,但是
laravel-enum与其他两种方法完全不同(都是静态方法),可以使用Macroable,所以我认为尝试一下可能是个好主意。我无法像ValueObject一样处理它,因此我首先将其删除。
近似差异
<表格>
tr>
header>
<身体>
tr>
tr>
tr>
tbody>
table>
php-enum和laravel-enums非常相似,但是php-enum具有更多功能。
laravel-enum都是通过静态方法提供的,其设计概念与其他两种方法有很大不同。
使用示例
主题:我想将两种状态
基类定义
让我们看看如何定义每个Enum类。
印象数
除了
laravel-enum,它还实现了
laravel-enum的独特之处在于它使用了Macroable特性。
php-enum
1 2 | <?php abstract class Enum implements \JsonSerializable |
laravel-enum
1 2 3 4 | <?php abstract class Enum { use Macroable; |
laravel-枚举
1 2 | <?php abstract class Enum implements JsonSerializable |
具体类别
的定义
印象数
您可以直接通过更改基类来使用类定义的内容。
php-enum
1 2 3 4 5 6 7 8 9 10 11 12 | <?php namespace App\Enums\Task; use MyCLabs\Enum\Enum; // 定義 class TaskStatus extends Enum { const OPEN = 'open'; const CLOSE = 'close'; } |
laravel-enum
1 2 3 4 5 6 7 8 9 10 11 | <?php namespace App\Enums\Task; use BenSampo\Enum\Enum; class TaskStatus extends Enum { const OPEN = 'open'; const CLOSE = 'close'; } |
laravel-枚举
1 2 3 4 5 6 7 8 9 10 11 12 | <?php namespace App\Enums\Task; use Nasyrov\Laravel\Enums\Enum; // 定義 class TaskStatus extends Enum { const OPEN = 'open'; const CLOSE = 'close'; } |
实例化
印象数
只有
laravel-enum不能使用
php-enum
1 2 3 4 5 | <?php // インスタンス化 $status = new TaskStatus(TaskStatus::OPEN); // or $status = TaskStatus::OPEN(); |
laravel-enum
1 2 3 4 5 | <?php // インスタンス化 $status = new TaskStatus(TaskStatus::OPEN); // 下記はできない // $status = TaskStatus::OPEN(); |
laravel-枚举
1 2 3 4 5 | <?php // インスタンス化 $status = new TaskStatus(TaskStatus::OPEN); // or $status = TaskStatus::OPEN(); |
在实例
上的操作
印象数
php-enum的功能是可以与
php-enum
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?php // キーの取得 $status->getKey() /* => "OPEN" */ // 値の取得 $status->getValue() /* => "open" */ // 等価チェック $status->equals(TaskStatus::CLOSE()) /* => false */ // 文字列化 (string)$status /* => "open" */ // JSON化 json_encode($s) /* => ""open"" */ |
laravel-enum
没有
实例方法,它是一种调用静态方法并在value→key和key→value之间转换的形式。
1 2 3 4 5 6 7 8 9 10 11 12 | <?php // キーの取得 TaskStatus::getKey('open') /* => "OPEN" */ // 値の取得 TaskStatus::getValue('OPEN') /* => "open" */ |
laravel-枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php // キーの取得 $status->getKey() /* => "OPEN" */ // 値の取得 $status->getValue() /* => "open" */ // 文字列化 (string)$status /* => "open" */ // JSON化 json_encode($s) /* => ""open"" */ |
在
类上的操作
印象数
奇怪的是,laravel-enum提供了验证规则。
php-enum
有一个称为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php // キーの一覧取得 TaskStatus::keys() /* => [ "OPEN", "CLOSE", ] */ // 値の一覧取得 TaskStatus::values() /* => [ "OPEN" => App\Enums\Task\TaskStatus {#2880}, "CLOSE" => App\Enums\Task\TaskStatus {#2882}, ] */ // 妥当性検証 TaskStatus::isValid('close') /* => true */ |
laravel-enum
有一种称为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?php // キーの一覧取得 TaskStatus::getKeys() /* => [ "OPEN", "CLOSE", ] */ // 値の一覧取得 TaskStatus::getValues() /* => [ "open", "close", ] */ // キーと値の一覧取得 TaskStatus::toArray() /* => [ "OPEN" => "open", "CLOSE" => "close", ] */ // ドロップダウンリストに最適なキーと値の一覧取得 TaskStatus::toSelectArray() /* => [ "open" => "Open", "close" => "Close", ] */ |
验证规则
1 2 3 4 5 6 | <?php $rule = new EnumValue(TaskStatus::class) $rule->passes('status', 'open') /* => true */ |
laravel-枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php // キーの一覧取得 TaskStatus::keys() /* => [ "OPEN", "CLOSE", ] */ // 値の一覧取得 TaskStatus::values() /* => [ "OPEN" => App\Enums\Task\TaskStatus {#2880}, "CLOSE" => App\Enums\Task\TaskStatus {#2875}, ] */ // 値を定数化して一覧を取得 TaskStatus::constants() /* => Illuminate\Support\Collection {#2885 all: [ "OPEN" => "open", "CLOSE" => "close", ], } */ |
结论
我希望
不久将成为可以按标准处理枚举的PHP(如果当时符合myclabs / php-enum,我将不胜感激)。
laravel-enum和laravel-enums都是在app / Enums下创建的吗?