#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 к внешним службам.