Livewire: сохранение пользовательских объектов в компоненте Livewire после подключения:нажмите?

#laravel #laravel-livewire

Вопрос:

Могу ли я продолжать использовать коллекцию пользовательских объектов на протяжении всего жизненного цикла Livewire?
Я создаю коллекцию, показываю их в списке и принимаю меры, когда пользователь выбирает один из них.

На данный момент они все еще являются объектом в блейде @foreach (т. Е. {{ $item->name }} , но в конечном итоге становятся массивом после wire:click (т. Е. $item['name'] ), что прерывает повторный запуск @foreach после завершения wire:click метода.

Но что еще более важно, каждый пользовательский объект содержит коллекцию моделей, и они также преобразуются в обычный массив.

Похоже, что в настоящее время это ожидаемое поведение, поскольку Livewire не знает, как их регидрировать (в отличие от красноречивых моделей).

Я надеялся, что смогу хранить объекты в защищенной собственности, но они не сохраняются, как сказано в документации.

Есть ли способ добиться аналогичного потока, когда я отображаю список (используя данные из пользовательских объектов) и выполняю действия с выбранным пользовательским объектом?

Ответ №1:

protected свойства действительно полезны только для согласованных переменных, таких как правила, или переменных, которые задаются при каждом запросе, который не может быть общедоступным.

Что касается проблемы с коллекцией, похоже, что ответ уже есть в теме проблемы github, которую вы связали, просто повторно инициализировав массивы как объект. Это (на данный момент) ожидаемое поведение, поскольку оно не может регидрироваться. Вы можете сделать карту коллекции:

 $this->customCollection = $this->customCollection->map(function($item) {
    return is_array($item) ? (object) $item : $item;
});
 

или предисловие вроде этого:

 foreach ($this->customCollection as $index => $item) {
    if (is_array($item)) {
        $this->customCollection[$index] = (object) $item;
    }
}
 

Для каждого гнезда коллекций вам придется выполнить один и тот же цикл, если вам нужны специальные объекты. Это, вероятно, снизит производительность, и вам, вероятно, лучше использовать красноречивые коллекции/модели или чистые массивы.

Комментарии:

1. Спасибо Yinci, ответ в упомянутой проблеме действительно хорош в качестве обходного пути для простых объектов стандартного класса, но для этого потребуется пользовательское действие «регидратация» для регидратации каждой коллекции моделей Laravel в пользовательском объекте. Мне было интересно, есть ли разумный способ «сохранить» коллекцию пользовательских объектов. Теперь исследуем: кэширование коллекции и извлечение ее при каждом действии.

2. Я не думал о кэшировании. Кэширование-отличный вариант, если вам действительно нужна пользовательская коллекция. Есть какие-нибудь доводы относительно того, почему Красноречие не сработает в вашей ситуации?

3. Кэширование действительно выполняет свою работу. 🙂 Я провожу анализ Красноречивых моделей и создаю пользовательские объекты (например, результаты обратного геокодирования на основе координат трекпоинтов латлона, сгруппированных по посещениям). Только после того, как пользователь выберет одно из предложений, место преобразуется в модель Laravel и связывается с точками отслеживания посещений.

4. Я полагаю, что анализ относительно сложен? В противном случае наличие его в качестве атрибута мутатора также может решить проблему? (Еще не пробовал этого). В любом случае, рад слышать, что кэширование работает.

5. Да, анализ сложен и «дорог», так как требует вызовов REST API к внешним службам.