Laravel Livewire绑定模型Carbon属性

问题描述

我正在使用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的问题。如果您去支持它,将会很有帮助:)

https://github.com/livewire/livewire/pull/1665

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...