Laravel Livewire 绑定模型 Carbon 属性
Laravel Livewire bind model Carbon attribute
我正在使用 Laravel Livewire v2,我需要将表单日期输入绑定到后端 Livewire 组件中的模型 Carbon 属性,但似乎无法格式化到期日期。
更准确地说:
- 选择日期时,表单日期输入选择器 livewire 进行 api 调用并发送正确的日期(例如:
2020-02-02
)
- Livewire 组件正确接收字符串值并将其传递给模型
- 模型将字符串转换为 Carbon 对象并将其分配给其可填充属性
- Livewire 组件尝试将数据发送回客户端,但它没有对 Carbon 对象执行
->format('Y-m-d')
格式,因此发送了一个序列化的日期对象
- 当对象被反序列化时,前端接收例如
2012-12-25T20:30:00.000000+04:00 MSK
- 日期输入中断
我还发现在 Livewire v1 中可以转换属性 (link) using key-value array or custom casting methods, but this has been removed in v2 (link);有一个使用 hydrate
/dehydrate
方法实现相同效果的示例,但该示例涵盖了组件 属性 的情况,而不是像我这样的嵌套组件。
有没有办法在将数据发送回客户端时投射模型日期道具或添加格式?
更新 (2020-10-15)
从 Livewire v2.3 开始,模型转换现在可以在直接绑定到模型属性时工作(又名 wire:model
)。
您需要做的就是转到您的模型并提供您的日期转换,让我们以 Post
模型为例:
class Post extends Model
{
protected $casts = [
'published_at' => 'date:Y-m-d'
];
}
这将让 Livewire 知道您的 published_at
字段应以 Y-m-d
格式序列化以使用它 client-side,并将其转换回 Carbon
] (DateTime
) 更新时的实例。
现在,您可以安全地将其附加到您的 <input>
字段:
<input type="date" wire:model="published_at" />
旧答案
目前,有一个待处理的 PR 旨在为 Livewire v2 解决此问题。如果你去支持它会很有帮助:)
我正在使用 Laravel Livewire v2,我需要将表单日期输入绑定到后端 Livewire 组件中的模型 Carbon 属性,但似乎无法格式化到期日期。
更准确地说:
- 选择日期时,表单日期输入选择器 livewire 进行 api 调用并发送正确的日期(例如:
2020-02-02
) - Livewire 组件正确接收字符串值并将其传递给模型
- 模型将字符串转换为 Carbon 对象并将其分配给其可填充属性
- Livewire 组件尝试将数据发送回客户端,但它没有对 Carbon 对象执行
->format('Y-m-d')
格式,因此发送了一个序列化的日期对象 - 当对象被反序列化时,前端接收例如
2012-12-25T20:30:00.000000+04:00 MSK
- 日期输入中断
我还发现在 Livewire v1 中可以转换属性 (link) using key-value array or custom casting methods, but this has been removed in v2 (link);有一个使用 hydrate
/dehydrate
方法实现相同效果的示例,但该示例涵盖了组件 属性 的情况,而不是像我这样的嵌套组件。
有没有办法在将数据发送回客户端时投射模型日期道具或添加格式?
更新 (2020-10-15)
从 Livewire v2.3 开始,模型转换现在可以在直接绑定到模型属性时工作(又名 wire:model
)。
您需要做的就是转到您的模型并提供您的日期转换,让我们以 Post
模型为例:
class Post extends Model
{
protected $casts = [
'published_at' => 'date:Y-m-d'
];
}
这将让 Livewire 知道您的 published_at
字段应以 Y-m-d
格式序列化以使用它 client-side,并将其转换回 Carbon
] (DateTime
) 更新时的实例。
现在,您可以安全地将其附加到您的 <input>
字段:
<input type="date" wire:model="published_at" />
旧答案
目前,有一个待处理的 PR 旨在为 Livewire v2 解决此问题。如果你去支持它会很有帮助:)