Laravel заключает массив в кавычки в контроллере

#php #laravel

#php #laravel

Вопрос:

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

 $product = Product::find($id);
$product = collect($product->images->pluck('image_path'))->implode("','");
return $product;
  

Что я действительно хочу сделать, так это отправить этот массив в код javascript в блейде laravel.

 initialPreview: ['{{ $product}}'],
  

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

 initialPreview: ['img/uploads/urun/1552304918.jpegamp;#039;,amp;#039;img/uploads/urun/1552304918.jpeg'],
  

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

1. Можете ли вы показать нам пример того, что возвращает image_path и что возвращает ваш текущий код и что он должен возвращать :)?

2. img/uploads/urun/1552304918.jpeg','img/uploads/urun/1552304918.jpeg

3. @KasperFranz попросил 3 вещи, а вы дали ему 1 вещь? Я думаю, что понимаю, что вы имеете в виду. После ввода вы могли бы просто добавить кавычку к строке, чтобы получить что-то вроде 'img1.jpeg','img2.jpeg'

4. Вы внесли правку в свой пост, поэтому я мог бы ответить и на это. {{$var}} экранирует символы, используйте {!! $product !!} , чтобы не экранировать символы

5. @TeunissenStefan извините за это, код оттуда возвращает несколько путей к изображениям из базы данных. Я хочу использовать, я пытаюсь использовать начальный предварительный просмотр для kartik-v/bootstrap-fileinput

Ответ №1:

Создание строки javascript самостоятельно для этой цели имеет больше скрытых сложностей, чем вы можете себе представить. Вам не только нужно заключить массив в кавычки и добавить запятые, чтобы создать допустимую строку javascript, но вам также необходимо надежно экранировать специальные символы в строках, прежде чем они будут заключены.

Поскольку ваша фактическая цель — создать массив для javascript, в Laravel лучше создать свой php-массив, а затем отложить до @json для правильной кодировки.

Для построения массива путей:

 $product = Product::find($id);
$product_paths = $product->images->pluck('image_path'); // value: ["img/...","img/..."]
  

Использование в виде блейда (в блоке скрипта):

 <script>
    //...

    initialPreview: @json($product_paths),

</script>
  

Использование в виде блейда (внутри атрибута HTML):

 <!-- Seeding a data-* attribute, e.g. for jQuery -->
<ul data-initial-preview='@json($product_paths)'></ul>

<!-- Seeding a Vue component property -->
<example-component :initial-preview='@json($product_paths)'></example-component>
  

Примечание: Использование одинарных кавычек ' в этом контексте, а не двойных кавычек " , важно из-за того, что кавычки экранируются json_encode() за кулисами.

Ответ №2:

Мой Laravel немного заржавел, но это должно быть то, что вы хотите сделать:

 $product = Product::find($id);
$product = collect($product->images->pluck('image_path'))
           ->transform(function ($item, $key) {
              return "'" . $item ."'";
           })
           ->implode(",");
return $product;
  

Изменения:

  • Добавлен вызов функции преобразования.
  • Удалена кавычка из вызова implode

Это решение может быть красивее, но это очень быстрый способ сделать это.