이 글의 예시에서는 Laravel에서 수동 페이징을 구현하는 방법을 설명합니다. 참고용으로 공유해 주세요. 자세한 내용은 다음과 같습니다.
여기 데모 예제는 Laravel 버전 5.2를 기준으로 합니다.
개발 과정에서 상황이 발생하여 Java API를 요청합니다. 정보를 얻으려면 정보가 많고 페이지에 표시해야하기 때문입니다. Laravel은 공식적으로 paginate($perPage)라는 간단한 메소드를 제공하지만 이 메소드는 모델 및 쿼리 빌더에만 적용됩니다.
오늘은 배열이 주어지면 페이지 매김 방식과 동일한 효과를 얻는 방법에 대해 이야기하겠습니다.
paginate 메소드 소스보기
#vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:480 public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) { $query = $this->toBase(); $total = $query->getCountForPagination(); $this->forPage( $page = $page ?: Paginator::resolveCurrentPage($pageName), $perPage = $perPage ?: $this->model->getPerPage() ); return new LengthAwarePaginator($this->get($columns), $total, $perPage, $page, [ 'path' => Paginator::resolveCurrentPath(), 'pageName' => $pageName, ]); }
위에서 볼 수 있듯이 페이징의 핵심은 LengthAwarePaginator에 있습니다.
LengthAwarePaginator의 구성 방법.
public function __construct($items, $total, $perPage, $currentPage = null, array $options = []) { foreach ($options as $key => $value) { $this->{$key} = $value; } $this->total = $total; $this->perPage = $perPage; $this->lastPage = (int) ceil($total / $perPage); $this->path = $this->path != '/' ? rtrim($this->path, '/') : $this->path; $this->currentPage = $this->setCurrentPage($currentPage, $this->lastPage); $this->items = $items instanceof Collection ? $items : Collection::make($items); }
실제로 페이징할 배열이
[ ['username'=>'zhangsan', 'age'=>26], ['username'=>'lisi', 'age'=>23], ['username'=>'wangwu', 'age'=>62], ['username'=>'zhaoliu', 'age'=>46], ['username'=>'wangmazi', 'age'=>25], ['username'=>'lanzi', 'age'=>24], ['username'=>'pangzi', 'age'=>21], ]
이면 이미 매우 명확합니다. 총 7개의 데이터가 있고 각 페이지에는 3개가 표시됩니다. 총 3페이지
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\Paginator; use Illuminate\Http\Request; # 仅做演示 # function userList(Request $request) { $users = [ ['username'=>'zhangsan', 'age'=>26], ['username'=>'lisi', 'age'=>23], ['username'=>'wangwu', 'age'=>62], ['username'=>'zhaoliu', 'age'=>46], ['username'=>'wangmazi', 'age'=>25], ['username'=>'lanzi', 'age'=>24], ['username'=>'pangzi', 'age'=>21] ]; $perPage = 3; if ($request->has('page')) { $current_page = $request->input('page'); $current_page = $current_page <= 0 ? 1 :$current_page; } else { $current_page = 1; } $item = array_slice($users, ($current_page-1)*$perPage, $perPage); //注释1 $total = count($users); $paginator =new LengthAwarePaginator($item, $total, $perPage, $currentPage, [ 'path' => Paginator::resolveCurrentPath(), //注释2 'pageName' => 'page', ]); $userlist = $paginator->toArray()['data']; return view('userlist', compact('userlist', 'paginator')); }
위 코드의 포커스는 $item입니다. 댓글 1을 처리하지 않으면 7개의 데이터가 모두 획득됩니다.
참고 2는 페이지네이션할 URL 주소를 설정하는 것입니다. $paginator ->setPath('path')를 통해 수동으로 설정할 수도 있습니다.
페이지 내 페이징 연결도 같은 방식으로 호출됩니다.
{{ $paginator->render() }}
정정!
이 글이 Laravel 프레임워크를 기반으로 하는 모든 분들의 PHP 프로그램 설계에 도움이 되기를 바랍니다.
Laravel 매뉴얼 페이징 구현 방법 및 관련 글에 대한 자세한 설명은 PHP 중국어 홈페이지를 참고해주세요!