Отправка массивов в блейд-компонент (Laravel 8)

#php #laravel #laravel-blade #laravel-8

Вопрос:

Я пытаюсь создать компонент x-select, в котором я могу передать массив параметров в качестве одного из атрибутов.

Вот create.blade.php:

 <?php $list = ['Received', 'In Process', 'Repaired', 'Completed', 'Shipped', 'Waiting on Boards', 'In Route'];?>
<x-select id="progress" class="block mt-1 w-full" name="progress" :value="old('progress')" :list="$list" />
 

Вот компонент select.blade.php

 @props(['disabled' => false])

<select {{ $disabled ? 'disabled' : '' }} {!! $attributes->merge(['class' => 'rounded-md shadow-sm border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50']) !!}>
    @foreach ($list as $item)
        <option @if($item == $value) selected @endif>{{ $item }}</option>
    @endforeach
</select>
 

Проблема в том, что он пытается проанализировать/распечатать :list , когда он запускает $attributes->merge() . Похоже, что это не так, как должно быть, так как, согласно документам Laravel 8 Blade, похоже, вы можете добавить :attribute файл, который не печатается при запуске $attributes->merge() . См.: https://laravel.com/docs/8.x/blade#default-merged-attributes

Если я изменю значение :list на обычную строку, она напечатает строку при запуске $attributes->merge() , что противоречит этим документам и делает так, что я не могу передать массив, потому что он пытается обрезать массив и терпит неудачу с этой ошибкой:

 trim() expects parameter 1 to be string, array given
 

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

1. Не связано: $item должно быть {{ $item }} внутри лезвия в вашем <option>

2. Спасибо, я обновил свой вопрос.

Ответ №1:

Сначала вы можете упорядочить массив, используя json_encode :

 <?php $list = json_encode(['Received', 'In Process', 'Repaired', 'Completed', 'Shipped', 'Waiting on Boards', 'In Route']); ?>
 

Затем вы можете превратить его обратно в массив, используя json_decode :

 @foreach(json_decode($list, true) as $item)
{{-- your code here --}}
@endforeach