什么是 Cast
Eloquent 的 Cast 是将从数据库取出的原始值转换为 PHP 数据类型的机制,保存时会反向转换回去。在casts 方法中定义。
内置 Cast 一览
Laravel 标准提供的 Cast 列表如下。AsArrayObject 与 AsCollection 为了让你能直接修改数组的特定偏移,在 Laravel 内部实际是以自定义 Cast 实现的。创建自定义 Cast 类
当内置 Cast 无法满足转换需求时,可以通过实现CastsAttributes 接口创建自定义 Cast。
接口定义
框架本体的契约定义如下。$attributes 参数中包含模型的全部属性,因此也可以做跨多列的转换(参见后文的 Value Object 模式)。
基础自定义 Cast 实现
使用make:cast 命令生成模板。
app/Casts/AsMoney.php。举例来说,我们实现一个将金额(以整数存储)转换为 Money Value Object 的 Cast。
$order->price 就会返回 Money 实例。
Value Object Cast
将多个 DB 列打包为一个 Value Object 的模式。实现示例:地址 Cast
将address_line_one 与 address_line_two 两列合并为 Address Value Object。
当
set 方法返回数组时,Eloquent 会以键作为列名,将值保存到相应的列。单列 Cast 时则返回字符串或整数。Value Object 的缓存
被转换为 Value Object 的属性值会被 Eloquent 缓存。对同一属性访问两次会返回同一对象实例。 若要禁用缓存,在 Cast 类中添加$withoutObjectCaching 属性。
入站 Cast(仅写入)
只在写入 DB 时进行转换,读取时不做转换的 Cast。实现CastsInboundAttributes 接口即可。
典型用途是哈希。仅在保存密码或密钥时转换,读取时直接返回哈希值。
Cast 参数
若要向自定义 Cast 传入参数,在类名后用冒号分隔指定,多参数用逗号分隔。Castables:让 Value Object 持有 Cast 逻辑
实现Castable 接口的 Value Object 拥有返回其 Cast 类的 castUsing 方法。这样模型侧无需知道具体的 Cast 类,领域逻辑更加整洁。
与 $appends、$hidden 的交互
Cast 与 $appends、$hidden 是相互独立的机制,但组合使用时需要注意。
运行时追加 Cast
当只想为特定查询或请求追加 Cast 时,使用mergeCasts 方法。
下一步
Eloquent Observer 与模型事件
学习如何在模型的保存、删除等生命周期事件上挂钩以追加处理。