konekt / enum-eloquent
Eloquent 模型中的枚举属性类型转换
1.9.3
2024-01-08 15:50 UTC
Requires
- php: ^8.0
- illuminate/database: ^8.75|9.*|10.*|11.*
- konekt/enum: ^2.0.2 || ^3.0 | ^4.0
Requires (Dev)
- illuminate/events: ^8.75|9.*|10.*|11.*
- phpunit/phpunit: 9 - 10
README
此包为 Eloquent 模型提供对 konekt 枚举 字段的自动类型转换支持。
支持的 Konekt 枚举版本为 2.x, 3.x 和 4.x,与 Eloquent (Laravel) 8 - 11 版本兼容
安装
composer require konekt/enum-eloquent
使用方法
- 将
CastsEnums
特性添加到您的模型中 - 通过模型上的
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 枚举文档。