将枚举与Laravel一起使用


关于本文

我研究了在Laravel中使用Enum时要使用哪个软件包。

比较目标是以下三个。

  • myclabs / PHP枚举
  • BenSampo / Laravel-枚举
  • 纳西罗夫/ laravel-enums

参考)SplEnum

以下将其描述为php-enum,laravel-enum,laravel-enums。

除了

php-enum,它是针对Laravel的,您可以使用php artisan make:enum创建一个骨骼。

SplEnum被排除在外,因为它需要pecl,但是我希望它将很快作为标准提供。

结论

我认为php-enum会很好。

我对

laravel-enums不知所措,但是artisan make:enum具有固定的输出目标 1,所以我认为即使可以使用它也不会使用它,并且< x2我选择了>和isValid(),因为我认为可以使用它们。

laravel-enum与其他两种方法完全不同(都是静态方法),可以使用Macroable,所以我认为尝试一下可能是个好主意。我无法像ValueObject一样处理它,因此我首先将其删除。

近似差异

<表格>

包名称

最新版本

GitHub Stars


<身体>

myclabs / php-enum

1.6.2

739

BenSampo / laravel-enum

1.12.0

251

nasyrov / laravel-enums

1.1.6

25


php-enum和laravel-enums非常相似,但是php-enum具有更多功能。

laravel-enum都是通过静态方法提供的,其设计概念与其他两种方法有很大不同。

使用示例

主题:我想将两种状态openclose作为TODO应用程序中的枚举处理。

基类定义

让我们看看如何定义每个Enum类。

印象数

除了

laravel-enum,它还实现了jsonSerialize()__toString()方法。

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不能使用__callStatic实例化(类似于Enum::HOGE())。

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的功能是可以与equals进行比较。

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

有一个称为

isValid()的验证方法。

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

有一种称为

toSelectArray的方法,该方法返回HTML选择标记的最佳键值对列表。

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下创建的吗?