#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. Это очень помогло бы, если бы вы пошли и поддержали его 🙂