Laravel: ответ Paginate json

Я получаю данные json из Google Fonts и отображаю их на своем сайте. Я пытаюсь использовать пагинатор laravel для разбивки этих данных на страницы, потому что, когда я отображаю их в целом, это сказывается на производительности, но я еще не нашел, как это сделать.

это мой контроллер

public function googleFonts()
{     
$url = "https://www.googleapis.com/webfonts/v1/webfonts?key = { my key here}";
 $r = collect(json_decode(file_get_contents( $url ),true));
return view ('googleFonts',compact('result'))->render();
}

и это в моем файле лезвия

 @foreach($result->items as $font)

        <tr>
          <td>{{$font->family }}</td>
          <td <p style = "font-family: '{{$font->family}}',serif;font-size: 22px">Lorem ipsum</p></td>
          <td>{{implode(', ', $font->variants) }}</td>
          <td>{{$font->category }}</td>
          <td>{{implode(', ', $font->subsets) }}</td>
          <td>{{$font->version }}</td>
        </tr>
       @endforeach

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

покажите мне скриншоты и сделайте свой вопрос более ясным и конкретным

user7993010 03.05.2018 06:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
1
3 198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете разбивать данные на страницы вручную, используя коллекцию или собственный массив, создав экземпляр этого класса Illuminate\Pagination\LengthAwarePaginator.

// Set default page
$page = request()->has('page') ? request('page') : 1;

// Set default per page
$perPage = request()->has('per_page') ? request('per_page') : 15;

// Offset required to take the results
$offset = ($page * $perPage) - $perPage;

// At here you might transform your data into collection
$url = "https://www.googleapis.com/webfonts/v1/webfonts?key = { my key here}";
$newCollection = collect(json_decode(file_get_contents( $url ),true));

// Set custom pagination to result set
$results =  new LengthAwarePaginator(
     $newCollection->slice($offset, $perPage),
     $newCollection->count(),
     $perPage,
     $page,
     ['path' => request()->url(), 'query' => request()->query()]
);

return view('googleFonts',compact('results'));

я получаю Undefined variable: newCollection

kristi tanellari 03.05.2018 06:32
$newCollection - это переменная, обратите внимание на мой ответ и посмотрите на эту часть $newCollection = collect(json_decode(file_get_contents( $url ),true));
Norlihazmey Ghazali 03.05.2018 06:34

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

Norlihazmey Ghazali 03.05.2018 06:47

это то, что я получаю сейчас Cannot access protected property Illuminate\Pagination\LengthAwarePaginator::$items это представление `@foreach ($ results-> items as $ font) <tr> <td> {{$ font-> family}} </td> <td <p style = " font-family: '{{$ font-> family}}', serif; font-size: 22px "> Lorem ipsum </p> </td> <td> {{implode (',', $ font->) варианты)}} </td> <td> {{$ font-> category}} </td> <td> {{implode (',', $ font-> подмножества)}} </td> <td> {{$ font-> version}} </td> </tr> @endforeach '' {{$ results-> links ()}} '

kristi tanellari 03.05.2018 06:55

Это зависит от вашей структуры данных. Можете показать результаты dd($results). Поместите это перед тем, как вернуться к просмотру.

Norlihazmey Ghazali 03.05.2018 07:02
LengthAwarePaginator {#719 ▼ #total: 2 #lastPage: 1 #items: Collection {#720 ▼ #items: array:2 [▼ "kind" => "webfonts#webfontList" "items" => array:877 [▶] ] } #perPage: 15 #currentPage: 1 #path: "http://localhost/codefield_testing/googlefonts" #query: [] #fragment: null #pageName: "page" }
kristi tanellari 03.05.2018 07:03

Хорошо, вы должны разбивать на страницы сами элементы, а не коллекцию. Можешь dd(json_decode(file_get_contents( $url ),true)) и показать результат внутри pastebin

Norlihazmey Ghazali 03.05.2018 07:14

Окей, вместо $newCollection = collect(json_decode(file_get_contents( $url ),true)); заменить на $newCollection = collect(json_decode(file_get_contents( $url ),true)['items]);

Norlihazmey Ghazali 03.05.2018 07:18

все еще появляется та же ошибка Cannot access protected property Illuminate\Pagination\LengthAwarePaginator::$items

kristi tanellari 03.05.2018 07:24

Чтобы получить результат из просмотра, используйте это вместо @foreach($results->items() as $font). Не $results->items

Norlihazmey Ghazali 03.05.2018 07:25

теперь я получаю Trying to get property 'family' of non-object

kristi tanellari 03.05.2018 07:27

А разбиваемый на страницы элемент представляет собой массив, поэтому вы должны получить к нему доступ, используя квадратную скобку [] вместо объектной нотации ->. Например: $font['family']. Сделайте то же самое и с другими атрибутами

Norlihazmey Ghazali 03.05.2018 07:27

вау, это сработало. Я не могу вас отблагодарить. Я долгое время пытался заставить эту работу работать. Еще раз спасибо !! :)

kristi tanellari 03.05.2018 07:32

Рад это слышать. Добро пожаловать :). Вы можете добавить что угодно внутри экземпляра lengthAwarePaginator. Следуйте этому руководству https://laravel.com/api/5.6/Illuminate/Contracts/Pagination/‌​LengthAwarePaginator‌​.html

Norlihazmey Ghazali 03.05.2018 07:33

Еще раз спасибо. Очень признателен

kristi tanellari 03.05.2018 07:36

Добро пожаловать, братан :).

Norlihazmey Ghazali 03.05.2018 07:37

Это сработало в моем случае, но я столкнулся с новой проблемой, а именно с возможностью повторно использовать код, поскольку я буду делать различные вызовы другим конечным точкам, если я хочу повторно использовать это для другого URL-адреса в API, есть ли способ превратить это в метод? Возможно в модели? Было бы очень полезно, если бы вы могли показать пример, спасибо !!

Eduardo 03.04.2021 21:30

@Eduardo на самом деле вы можете разместить этот код где угодно, подумайте о том, чтобы поместить его в метод базового контроллера. Поэтому всякий раз, когда создается новый контроллер, вы можете сразу же повторно использовать код.

Norlihazmey Ghazali 19.04.2021 08:26

Другие вопросы по теме