Laravel Livewire привязка углеродного атрибута модели

#laravel #casting #date-formatting #laravel-livewire

#laravel #Кастинг #форматирование даты #laravel-livewire

Вопрос:

Я использую Laravel Livewire v2, и мне нужно привязать ввод даты формы к атрибуту Carbon модели во внутреннем компоненте Livewire, но, похоже, форматирование даты выполнения невозможно.

Чтобы быть более точным:

  • при выборе даты средство выбора даты формы livewire выполняет вызов api, отправляя правильную дату (например: 2020-02-02 )
  • компонент Livewire правильно получает и передает строковое значение модели
  • модель приводит строку к объекту Carbon и присваивает ее своему заполняемому атрибуту
  • компонент Livewire пытается отправить обратно клиенту данные, но он не выполняет ->format('Y-m-d') форматирование для объекта Carbon, поэтому отправляется сериализованный объект date
  • когда объект не сериализован, он получает, например 2012-12-25T20:30:00.000000 04:00 MSK
  • разрыв ввода даты

Я также обнаружил, что в Livewire v1 можно было приводить свойства (ссылку) с использованием массива ключ-значение или пользовательских методов приведения, но это было удалено в версии 2 (ссылка); есть пример с hydrate / dehydrate methods для достижения того же эффекта, но пример охватывает случай свойства компонента,не вложенный, как в моем случае.

Есть ли способ создать реквизит даты модели или добавить формат при отправке данных обратно клиенту?

Ответ №1:

Обновление (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 ( DateTime ) при каждом его обновлении.

Теперь вы можете безопасно прикрепить его к своему <input> полю:

 <input type="date" wire:model="published_at" />
  

Старый ответ

В настоящее время находится на рассмотрении PR, целью которого является решение этой проблемы для Livewire v2. Это очень помогло бы, если бы вы пошли и поддержали его 🙂

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