Я получаю данные 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
когда я возвращаю данные без разбивки на страницы, все работает, но когда я пытаюсь разбить на страницы, что бы я ни пробовал, все ломается. Любые идеи будут очень полезны






Вы можете разбивать данные на страницы вручную, используя коллекцию или собственный массив, создав экземпляр этого класса 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
$newCollection - это переменная, обратите внимание на мой ответ и посмотрите на эту часть $newCollection = collect(json_decode(file_get_contents( $url ),true));на самом деле вы можете вызывать напрямую, как это делалось при обычной разбивке на страницы, поскольку он возвращал только объекты разбиения на страницы. Просто передайте данные для просмотра, как и вы. См. Обновленный ответ
это то, что я получаю сейчас 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 ()}} '
Это зависит от вашей структуры данных. Можете показать результаты dd($results). Поместите это перед тем, как вернуться к просмотру.
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" }Хорошо, вы должны разбивать на страницы сами элементы, а не коллекцию. Можешь dd(json_decode(file_get_contents( $url ),true)) и показать результат внутри pastebin
Окей, вместо $newCollection = collect(json_decode(file_get_contents( $url ),true)); заменить на $newCollection = collect(json_decode(file_get_contents( $url ),true)['items]);
все еще появляется та же ошибка Cannot access protected property Illuminate\Pagination\LengthAwarePaginator::$items
Чтобы получить результат из просмотра, используйте это вместо @foreach($results->items() as $font). Не $results->items
теперь я получаю Trying to get property 'family' of non-object
А разбиваемый на страницы элемент представляет собой массив, поэтому вы должны получить к нему доступ, используя квадратную скобку [] вместо объектной нотации ->. Например: $font['family']. Сделайте то же самое и с другими атрибутами
вау, это сработало. Я не могу вас отблагодарить. Я долгое время пытался заставить эту работу работать. Еще раз спасибо !! :)
Рад это слышать. Добро пожаловать :). Вы можете добавить что угодно внутри экземпляра lengthAwarePaginator. Следуйте этому руководству https://laravel.com/api/5.6/Illuminate/Contracts/Pagination/LengthAwarePaginator.html
Еще раз спасибо. Очень признателен
Добро пожаловать, братан :).
Это сработало в моем случае, но я столкнулся с новой проблемой, а именно с возможностью повторно использовать код, поскольку я буду делать различные вызовы другим конечным точкам, если я хочу повторно использовать это для другого URL-адреса в API, есть ли способ превратить это в метод? Возможно в модели? Было бы очень полезно, если бы вы могли показать пример, спасибо !!
@Eduardo на самом деле вы можете разместить этот код где угодно, подумайте о том, чтобы поместить его в метод базового контроллера. Поэтому всякий раз, когда создается новый контроллер, вы можете сразу же повторно использовать код.
покажите мне скриншоты и сделайте свой вопрос более ясным и конкретным