Laravel Livewire 绑定(bind)模型 Carbon 属性

标签 laravel casting date-formatting laravel-livewire

我正在使用 Laravel Livewire v2,我需要将表单日期输入绑定(bind)到后端 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 中,可以使用键值数组或自定义转换方法转换属性( link ),但在 v2 中已删除( link );有一个示例 hydrate/dehydrate实现相同效果的方法,但该示例涵盖了组件属性的情况,而不是我的情况下的嵌套属性。
    有没有办法在将数据发送回客户端时转换模型日期 Prop 或添加格式?

    最佳答案

    更新 (2020-10-15)
    从 Livewire v2.3 开始,模型转换现在可以在直接绑定(bind)到模型属性时工作(又名 wire:model)。
    您需要做的就是转到您的模型并提供您的日期类型转换,让我们采取Post以模型为例:

    class Post extends Model
    {
        protected $casts = [
            'published_at' => 'date:Y-m-d'
        ];
    }
    
    这将使 Livewire 知道您的 published_at字段应以 Y-m-d 格式序列化在客户端使用它,并将其转换回 Carbon ( DateTime ) 实例更新。
    现在,您可以安全地将它附加到您的 <input> field :
    <input type="date" wire:model="published_at" />
    
    旧答案
    目前,有一个待定的 PR 旨在为 Livewire v2 解决这个问题。如果你去支持它会很有帮助:)
    https://github.com/livewire/livewire/pull/1665

    关于Laravel Livewire 绑定(bind)模型 Carbon 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64064239/

    相关文章:

    php - 在 Laravel 中安全地编辑第三方 Composer (供应商)包并防止在发布新版本包时丢失自定义更改

    laravel - 播种具有多个关系的表?

    c - 在 C 中转换指针的规则是什么?

    迄今为止 ISO 8601 的 python 字符串

    php - 用于连接多个表的 Laravel ORM

    php - 如何创建Laravel 5.1自定义身份验证驱动程序?

    Python int float 舍入

    java - 无法将 Arraylist 转换为 Double 以生成 double 组

    python - PyQt:QDateComboBox setDate 使用字符串?

    datetime - nutch-solr:将网页元数据中的日期格式化为正确的Solr格式