Merhaba Arkadaşlar,
Bugün sizlere Laravel 4’te Cache + Pagination (sayfa numaralandırma)’nın nasıl gerçekleşeceğini anlatacağım:
Laravel Türkiye Forumları ve Laravel Türkiye Facebook Sayfası’nda pek çok kez sorulan bu soruya basit bir yaklaşım kullanarak kendimce bir çözüm getirdim.
Nasıl? Link to heading
Öncelikle yazdığım kodu yapıştırayım:
<?php
/**
* @author Arda Kılıçdağı
* @link http://arda.pw
*/
Route::get('cache_pagination', function(){
//sayfa başına kaç tane olacak?
$sayfaBasinaKacTane = 10;
//sorgu çıktısını varsa cache'den alalım, yoksa Model'den çekip cache'e ekleyelim:
$query = Cache::remember('koleksiyonum', 15, function(){
return Model::sorgum(); //kendinizce bir Eloquent ya da Fluent sorgu, tümünü çekmelisiniz.
});
//Koleksiyonda kaç tane element var?
$kacTaneVar = $query->count();
//pagination classını initiate edelim
$pagination = Paginator::make($query->toArray(), $kacTaneVar, $sayfaBasinaKacTane);
//Koleksiyonu pagination değerine göre Slice'layalım:
//Slice'lanmış query, view'a bu gidecek:
$query = $query->slice(
($pagination->getCurrentPage()-1)*$pagination->getPerPage(),
$pagination->getPerPage()
);
//Şimdi view'a yollayabiliriz:
return View::make('frontend.index')
->with('data', $query)
->with('pagination', $pagination);
});
Aslında oldukça basit; Kısaca açıklamam gerekirse:
- Öncelikle Cache’den koleksiyonun tamamını alıyorum (
paginate(10)
gibi değilget()
gibi bitmeli sorgu yani), Cache’de yoksa çekip o an Cache’e yazıyorum (örnekte 15 dakika Cache’de). - Ardından koleksiyonda kaç adet element olduğunu alıyorum (bu değer
Pagination
sınıfını init ederkenslice()
için sınıf’a bilgi verecek) - Bunun ardından
Pagination
sınıfını init ediyorum. Parametre tanımlarken koleksiyonu->toArray()
ile döndürüyorum (array_slice()
kullanıyor arka planda bu metod). View içinde değerlere yine$each->isim
gibi nesne şeklinde erişebilirsiniz bu sadece init ederken lazım). - Bunun ardından slice ediyorum. Slice ederken
getCurrentPage()
metodu ile hangi sayfada olduğumu yakalıyor, bunun bir eksiği ile sayfa başına düşecek değeri çarparak hangi offsetten başlayacağımı yakalıyorum (mesela sayfa 3 içinslice()
içinde parametrelerslice((3-1)*10,10)
, yanislice(20,10)
. Mantık olarak da 3. sayfa 20-30 arasını göstereceği için, burada da yirminci elementten başlayıp 10 tane al ve kesip bize ver diyoruz yani). - En son olarak da slice’lanan koleksiyonu ve de
Pagination
sınıfını init ederken atadığımız$pagination
değişkenini View’a gönderiyoruz. Bu sayede View içinde$pagination->links()
diye pagination linklerine erişebilirsiniz.
Umarım birilerinin işine yarar.