konekt/enum-eloquent

Eloquent 模型中的枚举属性类型转换

1.9.3 2024-01-08 15:50 UTC

This package is auto-updated.

Last update: 2024-09-12 16:21:58 UTC


README

Tests Packagist Stable Version Packagist downloads StyleCI MIT Software License

此包为 Eloquent 模型提供对 konekt 枚举 字段的自动类型转换支持。

支持的 Konekt 枚举版本为 2.x, 3.x 和 4.x,与 Eloquent (Laravel) 8 - 11 版本兼容

变更日志

安装

composer require konekt/enum-eloquent

使用方法

  1. CastsEnums 特性添加到您的模型中
  2. 通过模型上的 protected $enums 属性定义要转换的属性

示例

枚举

namespace App;

use Konekt\Enum\Enum;

class OrderStatus extends Enum
{
    const __DEFAULT = self::PENDING; 
    // const __default = self::PENDING; // usage of default in v2.x 

    const PENDING   = 'pending';
    const CANCELLED = 'cancelled';
    const COMPLETED = 'completed';

}

模型

namespace App;

use Illuminate\Database\Eloquent\Model;
use Konekt\Enum\Eloquent\CastsEnums;

class Order extends Model
{
    use CastsEnums;

    protected $enums = [
        'status' => OrderStatus::class
    ];
}

客户端代码

$order = Order::create([
    'status' => 'pending'
]);

// The status attribute will be an enum object:
echo get_class($order->status);
// output: App\OrderStatus

echo $order->status->value();
// output: 'pending'

echo $order->status->isPending() ? 'yes' : 'no';
// output: yes

echo $order->status->isCancelled() ? 'yes' : 'no';
// output: no

// You can assign an enum object as attribute value:
$order->status = OrderStatus::COMPLETED();
echo $order->status->value();
// output: 'completed'

// It also works with mass assignment:
$order = Order::create([
    'status' => OrderStatus::COMPLETED()    
]);

echo $order->status->value();
// output 'completed'

// It still accepts scalar values:
$order->status = 'completed';
echo $order->status->isCompleted() ? 'yes' : 'no';
// output: yes

// But it doesn't accept scalar values that aren't in the enum:
$order->status = 'negotiating';
// throws UnexpectedValueException
// Given value (negotiating) is not in enum `App\OrderStatus`

枚举类运行时解析

可以将枚举类的解析延迟到运行时。

这是通过 Laravel 中已知的使用 ClassName@method 语法实现的。

这对于库来说很有用,这样您就可以“后期绑定”实际的枚举类,并允许用户扩展它。

示例

模型

namespace App;

use Illuminate\Database\Eloquent\Model;
use Konekt\Enum\Eloquent\CastsEnums;

class Order extends Model
{
    use CastsEnums;

    protected $enums = [
        'status' => 'OrderStatusResolver@enumClass'
    ];
}

解析器

namespace App;

class OrderStatusResolver
{
    /**
     * Returns the enum class to use as order status enum
     *
     * @return string
     */
    public static function enumClass()
    {
        return config('app.order.status.class', OrderStatus::class);
    }
}

这样,枚举类就可以配置,而无需修改模型代码。

Laravel Collective 表单兼容性

Laravel Collective 表单包 提供了来自 Laravel v4.x 的 Form 门面。

如果您想使用此表单包,您需要将 EnumsAreCompatibleWithLaravelForms 特性添加到模型中,与 CastsEnums 一起。

这将解决表单包检测字段的实际值而不是枚举标签作为字段值的问题。

这是通过向模型中添加(非文档化的)getFormValue() 方法来实现的,该方法是表单库用来获取表单字段值。

享受!

有关 konekt 枚举的详细使用方法,请参阅 Konekt 枚举文档