У меня есть ответ JSON (ответ выглядит как это), который отображает 20 источников новостей в моем представлении лезвия, я хочу использовать разбиение на страницы, чтобы на каждой странице отображалось только 10 результатов новостей, это мой контроллер:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
class NewsController extends Controller
{
public function index(){
$page = request()->has('page') ? request('page') : 1;
$perPage = request()->has('per_page') ? request('per_page') : 10;
$offset = ($page * $perPage) - $perPage;
$api = env('API_KEY');
$url = "https://newsapi.org/v2/top-headlines?country=id&apiKey=${api}";
$news = [];
$client = new \GuzzleHttp\Client();
$res = $client->get($url);
if ($res->getStatusCode() == 200){
$news = collect(json_decode(file_get_contents($url), true));
}else{
return "error";
}
$results = new LengthAwarePaginator(
$news->slice($offset, $perPage),
$news->count(),
$perPage,
$page,
['path' => request()->url(), 'query' => request()->query()]
);
return view('news', compact('results'));
}
}
и это мое представление лезвия, где в нижнем div я использую $results->links() для отображения ссылки на следующую страницу для просмотра других 10 результатов, но это не работает, поскольку вместо этого продолжает показывать все результаты новостей .
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta http-equiv = "X-UA-Compatible" content = "IE=edge">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<link href = "./app.css" rel = "stylesheet">
<title>laravel news app</title>
</head>
<body>
<div>
<h1 class = "head__text font-sans text-4xl m-3">News App</h1></h1>
<div class = "all__news">
@foreach($results['articles'] as $berita)
<div class = "news">
<h1 class = "news_title">{{$berita['title']}}</h1>
<p class = "news__desc">{{$berita['description']}}</p>
<span class = "news__author">{{$berita['author']}}</span><br>
<span class = "news__published">{{$berita['publishedAt']}}</span>
<span class = "news__source">{{$berita['source']['name']}}</span><br>
<a href = "{{ $berita['url'] }}" target = "_blank" class = "news__url">Link</a>
</div>
@endforeach
</div>
<div
{{$results->links()}}
</div>
</div>
</body>
</html>
это единственный маршрут, который у меня есть
Route::get('/', [NewsController::class, 'index']);
Вам нужно собирать статьи из результата API, а не самого результата API.
$news = collect((json_decode(file_get_contents($url), true))['articles']);
//or
$news = collect((json_decode(file_get_contents($url)))->articles);
и в цикле просмотра зациклить paginator напрямую
@foreach($results as $berita)
Попробуйте определить имя представления пагинатора. Что-то вроде: {{ $results->links('view.name') }}