Criar uma paginação customizada no Laravel com dados de uma collection

Talvez você seja um programador fodão em Laravel e fale “Mais isso todo mundo sabe fazer”. É ai que você se engana meu coleguinha, trabalho com Laravel a bastante tempo e posso dizer com toda certeza, muita gente tem dificuldade no momento de criar uma instância customizada de paginação com Laravel.

Logo abaixo, encontra-se uma função usando os recursos do Laravel, mas você pode criar uma classe, uma pacote ou seja la o que for necessário no seu caso.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
if (!function_exists('paginator_instance')) {

/**
* Cria uma intância personalizada do paginator, a qual pode ser usada em retornos de collect e retornis customizados
* @param collect/model $items Itens a serem paginados
* @param array $requests Requests que devem ser passados na paginação, por exemplo, uma busca (query) e etc
* @param int $perPage Quantidade de itens por página
* @param int $currentPage Página atual, normalmente vazio pois usa padrão do Laravel
* @param array $options Opções de paginação, normalmente, usa o padrão do Laravel
* @return paginator/collect Paginator com resultados
*/
function paginator_instance($items, $requests = [], $perPage = 10, $currentPage = null, array $options = [])
{
// Monta $perPage
$perPage = $perPage;

// Pega a página atual
// Se não preenchido, usa o método resolveCurrentPage() da \Illuminate\Pagination\LengthAwarePaginator
$page = $currentPage ? $currentPage : \Illuminate\Pagination\LengthAwarePaginator::resolveCurrentPage();

// Monta collection com itens para paginacao
$currentPageSearchResults = collect($items)->slice(($page - 1) * $perPage, $perPage)->all();

// Cria a paginação
$paginator = (new \Illuminate\Pagination\LengthAwarePaginator($currentPageSearchResults, count($items), $perPage, $page, $options >= 1 ? $options : [
'path' => \Illuminate\Pagination\Paginator::resolveCurrentPath(),
'pageName' => 'page',
]));

// Retorna os dados montado e com paginação
return $paginator->appends($requests);
}
}

Fácil né? Poisé!
Entenda melhor a classe LengthAwarePaginator e aqui você pode ver o arquivo completo no Github.


Dicas por Gercil Junio - https://gercil.me

Proudly powered by Hexo and Theme by Hacker
© 2020 Faz-B Man