> php教程 > PHP开发 > Laravel의 수동 페이징 구현 방법에 대한 자세한 설명

Laravel의 수동 페이징 구현 방법에 대한 자세한 설명

高洛峰
풀어 주다: 2016-12-28 16:29:16
원래의
1725명이 탐색했습니다.

이 글의 예시에서는 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, [
      &#39;path&#39; => Paginator::resolveCurrentPath(), //注释2
      &#39;pageName&#39; => &#39;page&#39;,
  ]);
  $userlist = $paginator->toArray()[&#39;data&#39;];
  return view(&#39;userlist&#39;, compact(&#39;userlist&#39;, &#39;paginator&#39;));
}
로그인 후 복사

위 코드의 포커스는 $item입니다. 댓글 1을 처리하지 않으면 7개의 데이터가 모두 획득됩니다.

참고 2는 페이지네이션할 URL 주소를 설정하는 것입니다. $paginator ->setPath('path')를 통해 수동으로 설정할 수도 있습니다.

페이지 내 페이징 연결도 같은 방식으로 호출됩니다.

{{ $paginator->render() }}
로그인 후 복사

정정!

이 글이 Laravel 프레임워크를 기반으로 하는 모든 분들의 PHP 프로그램 설계에 도움이 되기를 바랍니다.

Laravel 매뉴얼 페이징 구현 방법 및 관련 글에 대한 자세한 설명은 PHP 중국어 홈페이지를 참고해주세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿