富有表现力 , 经过 温德尔·阿德里尔 该工具可以将 Eloquent 模型转换为类型化的 PHP 对象,并在应用程序需要持久化数据时将这些对象转换回 Eloquent 模型。其目标是为服务、操作和测试提供类型化的对象边界,同时 Eloquent 继续处理查询、关系、类型转换、可见性规则、批量赋值和数据库写入等操作。
您无需在整个代码库中传递完整的 Eloquent 模型,而是使用具有公共类型属性的轻量级对象。这样既能将领域逻辑与数据库层分离,又无需放弃 Eloquent。
选择模型
模特通过添加以下内容选择加入:
IsExpressive
特征。属性,例如
#[Fillable]
和
#[Hidden]
描述模型如何映射到其类型化对应物:
使用
照亮\数据库\Eloquent\属性\可填充
;使用
照亮\数据库\Eloquent\属性\隐藏
;使用
照亮\数据库\Eloquent\Casts\属性
;使用
Illuminate\Database\Eloquent\Relations\HasMany
;使用
Illuminate\Database\Eloquent\Relations\HasOne
;使用
照亮\基金会\身份验证\用户
作为
可验证
;使用
WendellAdriel\Expressive\Concerns\IsExpressive
;#[
可填写
([
'姓名'
,
'电子邮件'
,
'角色'
,
'密码'
])]#[
隐
([
'密码'
,
'remember_token'
])]班级
用户
延伸
可验证{
使用
IsExpressive
;
民众
功能
帖子
()
:
HasMany{
返回
$this
->
hasMany
(
邮政
::班级
(英文):}
民众
功能
地址
()
:
有一个{
返回
$this
->
hasOne
(
地址
::班级
(英文):}
受保护
功能
尺寸
()
:
属性{
返回
属性
::
制作
(
得到
:
fn
()
:
细绳
=>
"{
$this
->
姓名
} ({
$this
->
角色
->
价值
})"
,(英文):}}
生成富有表现力的类
该软件包包含一个 Artisan 命令,用于根据现有模型生成类型化类:
php
工匠
表现力
用户
--model=
"App\Models\User"
默认情况下,生成的类位于
App\Expressive
每个类都继承自基类
Expressive
具有类型化公共属性的类,这些属性反映了模型的列、关系和访问器:
使用
应用程序\枚举\用户角色
;使用
应用程序\Expressive\地址
;使用
应用\Expressive\Post
;使用
碳\碳界面
;使用
照亮\支持\收藏
;使用
WendellAdriel\Expressive\Attributes\Relationship
;使用
WendellAdriel\Expressive\Attributes\Virtual
;使用
WendellAdriel\Expressive\Expressive
;最终的
班级
用户
延伸
富有表现力{
民众
?int
$id
=
无效的
;
民众
细绳
$name;
民众
细绳
邮箱地址;
民众
用户角色
角色;
民众
?
碳接口
$createdAt
=
无效的
;#[
关系
]
民众
?
地址
$地址
=
无效的
;
/**
@我们的
收藏
<
整数
,帖子>|null */#[
关系
]
民众
?
收藏
$posts
=
无效的
;#[
虚拟的
]
民众
?细绳
$displayName
=
无效的
;}
这
#[Relationship]
属性标记映射到 Eloquent 关系的属性,以及
#[Virtual]
标记访问器支持的值,例如
displayName
这些并不是真正的列。
将模型转换为类型化对象
称呼
expressive()
在模型、集合或查询构建器中,获取类型化对象。您可以选择性地包含访问器和关系:
// 具有虚拟属性的单个模型$用户
=
用户
::
查找或失败
(
1
)
->
富有表现力的
(
属性
:[
'display_name'
]);// 一个具有预加载关系的集合$用户
=
用户
::
询问
()
->
得到
()
->
富有表现力的
(
关系
:[
'帖子'
]);// 直接来自查询构建器$用户
=
用户
::
询问
()
->
在哪里
(
'积极的'
,
真的
)
->
富有表现力的
(
关系
:[
'帖子'
]);
已加载的关系会递归转换。
HasOne
关系成为相关模型的表达对象,并且
HasMany
关系变成了
Collection
富有表现力的物品。
持久化类型化对象
表达方式也可以走向另一个方向。
model()
该方法从类型化对象构建一个未保存的 Eloquent 实例,而
save()
坚持下去:
// 构建内存模型,无需写入数据库$模型
=
(
新的
应用程序\Expressive\用户
([
'姓名'
=>
“温德尔”
,
'电子邮件'
=>
'wendell@example.com'
,]))
->
模型
();// 持久化模型及其支持的关系已节省
=
(
新的
应用程序\Expressive\用户
([
'姓名'
=>
“温德尔”
,
'电子邮件'
=>
'wendell@example.com'
,]))
->
节省
();
这
save()
该方法保留了根模型以及支持的直接关系,包括
BelongsTo
,
HasOne
,
HasMany
,
MorphOne
, 和
MorphMany
这两种方法都遵循 Eloquent 的批量赋值规则,并忽略不可填充的属性,因此持久化过程通过 Eloquent 的标准机制进行。
安装
您可以通过 Composer 安装该软件包:
作曲家
要求
温德拉德里尔/laravel-expressive
然后您就可以发布配置文件了:
php
工匠
供应商:发布
--标签=
“富有表现力的”
该软件包需要 PHP 8.3 或更高版本,并支持 Laravel 12 和 13。更多信息,请参阅…… 文档 或者查看源代码 GitHub 。







