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ğil get() 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 ederken slice() 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çin slice() içinde parametreler slice((3-1)*10,10), yani slice(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.

Afiyet olsun ;) Link to heading