📜  laravel 枚举 (1)

📅  最后修改于: 2023-12-03 15:02:37.380000             🧑  作者: Mango

Laravel 枚举

在 Laravel 中,枚举(Enum)是一种用于将数字值与方便识别的名称相对应的数据类型。使用枚举可以提高代码的可读性和可维护性,避免硬编码。

定义枚举

在 Laravel 中,可以使用 BenSampo\Enum\Enum 类来定义枚举。例如,定义一个表示订单状态的枚举:

namespace App\Enums;

use BenSampo\Enum\Enum;

final class OrderStatus extends Enum
{
    const PENDING = 'pending';
    const PAID = 'paid';
    const SHIPPED = 'shipped';
}

上面的代码定义了一个 OrderStatus 枚举,它包含三个值:PENDINGPAIDSHIPPED。这些值都是以字符串的形式存储的,并且都具有易于理解的名称。

使用枚举

定义好枚举后,可以在代码的各处使用它。例如,在订单模型中可以定义一个 status 属性:

namespace App\Models;

use App\Enums\OrderStatus;
use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    protected $fillable = ['status'];

    public function getStatusAttribute($value)
    {
        return new OrderStatus($value);
    }

    public function setStatusAttribute($value)
    {
        $this->attributes['status'] = $value instanceof OrderStatus ? $value->value : $value;
    }
}

在上面的代码中,getStatusAttribute 方法用于将数据库中存储的字符串值转换为 OrderStatus 枚举;setStatusAttribute 方法用于将传入的 OrderStatus 枚举转换为字符串,以便保存到数据库中。

然后可以使用下面的代码创建一个订单:

$order = new Order(['status' => OrderStatus::PENDING]);
$order->save();

也可以使用下面的代码获取一个订单的状态:

$order = Order::find(1);
$status = $order->status;
枚举方法

BenSampo\Enum\Enum 类提供了一些实用的方法,例如:

  • getKeys():获取枚举中所有的键值;
  • getValues():获取枚举中所有的数值;
  • getKey($value):根据数值获取枚举中对应的键值;
  • getValue($key):根据键值获取枚举中对应的数值。

例如,在上面的 OrderStatus 枚举中可以使用 $keys = OrderStatus::getKeys() 获取所有键值,使用 $values = OrderStatus::getValues() 获取所有数值。

总结

使用枚举可以提高代码的可读性和可维护性,避免硬编码。在 Laravel 中,可以使用 BenSampo\Enum\Enum 类来定义和使用枚举。