Laravel Livewire 绑定模型 Carbon 属性

fud*_*udo 3 casting date-formatting laravel laravel-livewire

我正在使用 Laravel Livewire v2,我需要将表单日期输入绑定到后端 Livewire 组件中的模型 Carbon 属性,但似乎不可能进行到期日期格式化。

更准确地说:

  • 选择日期时的形式日期输入选择器的LiveWire作出API调用发送正确的日期(例如:2020-02-02
  • Livewire 组件正确接收字符串值并将其传递给模型
  • 模型将字符串转换为 Carbon 对象并将其分配给它的可填充属性
  • Livewire 组件尝试将数据发送回客户端,但它不执行 ->format('Y-m-d')对 Carbon 对象格式化,因此发送了一个序列化的日期对象
  • 当对象被反序列化时接收例如 2012-12-25T20:30:00.000000+04:00 MSK
  • 日期输入中断

我还发现在 Livewire v1 中可以使用键值数组或自定义转换方法转换属性(链接),但这在 v2(链接)中已被删除;有一个例子hydrate/dehydrate方法实现相同效果的示例,但该示例涵盖了组件属性的情况,而不是像我这样的嵌套属性。

有没有办法在将数据发送回客户端时投射模型日期道具或添加格式?

Jor*_*lez 10

更新 (2020-10-15)

从 Livewire v2.3 开始,模型转换现在可以在直接绑定到模型属性(也称为wire:model)时起作用。

您需要做的就是转到您的模型并提供您的日期转换,让我们以Post模型为例:

class Post extends Model
{
    protected $casts = [
        'published_at' => 'date:Y-m-d'
    ];
}
Run Code Online (Sandbox Code Playgroud)

这将使 Livewire 知道您的published_at字段应该以格式序列化以在Y-m-d客户端使用它,并在更新时将其转换回Carbon( DateTime) 实例。

现在,您可以安全地将其附加到您的<input>领域:

<input type="date" wire:model="published_at" />
Run Code Online (Sandbox Code Playgroud)

旧答案

目前,有一个悬而未决的 PR 旨在为 Livewire v2 解决这个问题。如果你去支持它会很有帮助:)

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