问题描述
我正在使用Laravel Livewire v2,我需要将表单日期输入绑定到后端Livewire组件中的模型Carbon属性,但是看来由于日期格式格式化是不可能的。
更准确地说:
- 在选择日期时,表单日期输入选择器Livewire会进行api调用以发送正确的日期(例如:
2020-02-02
) - Livewire组件正确接收并将字符串值传递给模型
- 模型将字符串强制转换为Carbon对象,并将其分配给其fillable属性
- Livewire组件尝试将数据发送回客户端,但是它没有对Carbon对象执行
->format('Y-m-d')
格式,因此发送了序列化日期对象 - 对象未序列化时会收到例如
2012-12-25T20:30:00.000000+04:00 MSK
- 输入日期中断
我还发现,在Livewire v1中,可以使用键值数组或自定义转换方法来转换属性(link),但是在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
的格式进行序列化,以便在客户端使用它,并将其转换回Carbon
({{ 1}})实例。
现在,您可以将其安全地附加到您的DateTime
字段:
<input>
旧答案
当前,有一个待解决的PR旨在解决Livewire v2的问题。如果您去支持它,将会很有帮助:)