• 05-12-2018, 15:26:48
    #1
    Merhabalar arkadaşlar, Laravel frameworku kullanıyorum ve mesajlaşma uygulamam için kullanıcıların mesajlaşma listesini döndürdüğüm index fonksiyonum gayet güzel çalışıyor fakat ileride kullanıcılar çok mesajlaşınca çok fazla item olacak ve mesajların açılması uzun sürecek diye bu fonksiyona ->paginate(10) dahil edip her sayfada 10 item döndürüp infinite scroll yapacağımki performans sorunu yaşamayıp dileyen kullanıcı aşağı indikçe yeni mesajlar yüklensin.

    Düşünce iyi hoş ama daha önce blogları veya postları listelemek için basit döngüler kullanıp sonuna ->paginate(10) ilave etmem yeterli oluyordu ama br yerden aldığım bu listeleme kodu çok karışık ve neresine ekleyeceğimi bulamadım, stackoverflowda onlarca yanıt geldi ama halen çözülemedi bir de şansımı buralarda deniyim dedim

    ChatController.php dosyamdaki index() fonksiyonum;

    public function index()
    {
        $contacts = [];
        $user = request()->user();
        // Loop through the contacts and format each one
    
        Contact::for($user->id)->get()->each(function ($contact) use ($user, &$contacts) {
            $friend = $contact->user1_id === $user->id ? $contact->user2 : $contact->user1;
            $contacts[] = $friend->toArray() + ['room' => $contact->room->toArray()];
        });
    
        return response()->json($contacts);
    }
    Json Çıktısı : https://0bin.net/paste/WLY6DwFcmLzS5...NyF/AUlGfCcpPA
  • 05-12-2018, 15:46:29
    #2
    Üyeliği durduruldu
    Hocam ben skip take kullanıyorum. Sayfalama için PaginateRequest oluşturdum bitane.

    "skip" => "required|integer|max:100000",
    "take" => "required|integer|max:100",

    Değişkenleri arayüzden post ediyorum hidden inputlarla, sayfada gösterilen içerik sayısı skip olarak, alınacak içerik sayısı take ile sayfada maks kaçtane alacaksam ama 100'ü geçirmeden, gönderiyorum.

    $user = User::skip(10)->take(10)->get();

    sayfa her aşağı indiğinde yüklenen içerik sayısını skip'e basıyorum.
  • 05-12-2018, 15:53:59
    #3
    fascinating adlı üyeden alıntı: mesajı görüntüle
    Hocam ben skip take kullanıyorum. Sayfalama için PaginateRequest oluşturdum bitane.

    "skip" => "required|integer|max:100000",
    "take" => "required|integer|max:100",

    Değişkenleri arayüzden post ediyorum hidden inputlarla, sayfada gösterilen içerik sayısı skip olarak, alınacak içerik sayısı take ile sayfada maks kaçtane alacaksam ama 100'ü geçirmeden, gönderiyorum.

    $user = User::skip(10)->take(10)->get();

    sayfa her aşağı indiğinde yüklenen içerik sayısını skip'e basıyorum.
    Teşekkürler hocam cevap için ama benim bu paginate işlemini laravelin sunduğu default halde yapmam gerekiyor çünkü daha önceki json çıktılarına göre modellerimi ayarladım iOS uygulama projemde, web için olsaydı dediğini deneyebilirdim ama mobil uygulamada kullanacağım için bana json içinde current page, next page vb satırlar gerekiyor mobil uygulamada hazırladığım modele direkt entegre etmek için
  • 05-12-2018, 16:07:33
    #4
    skip(0)->take(10)->get() veya modelresult->forPage($page, $limit) kullanmayı denediniz mi?
  • 05-12-2018, 16:13:43
    #5
    bayGaReZ adlı üyeden alıntı: mesajı görüntüle
    skip(0)->take(10)->get() veya modelresult->forPage($page, $limit) kullanmayı denediniz mi?
    şuan sizin öneriniz ile get() yerine skip(0)->take(1)->get() yazdım 3 item olduğu için sadece 1 item alıyor iyi güzel ama next page, current page gibi bölümler oluşmadı json çıktısında hocam. get() yerine paginate(10) yazıyorum yine aynı şekilde
  • 05-12-2018, 16:21:47
    #6
    halilyc adlı üyeden alıntı: mesajı görüntüle
    şuan sizin öneriniz ile get() yerine skip(0)->take(1)->get() yazdım 3 item olduğu için sadece 1 item alıyor iyi güzel ama next page, current page gibi bölümler oluşmadı json çıktısında hocam. get() yerine paginate(10) yazıyorum yine aynı şekilde
    Bu yöntem ile sayfalamayı siz yaparsınız, dolayısıyla nextpage, currentpage değerleri olmaz. örneğin siz her seferinde 10 adet eleman göndermek istiyorsunuz. Lazyload ile 5. sayfayı isteyen requesti attığınızda skip(4*10)->take(10)->get() demeniz yeterli. Yani:
    <?php
    $page = 1; // Query string ya da routing ile parametre olarak alabilirsiniz.
    $limit = 10;
    ..skip(($page-1)*$limit)->take($limit)->get();
    Affınıza sığınarak soruyorum, neden Lumen kullanmıyorsunuz? Mesajlarınızdan anladığım mobil uygulamaya api yazıyorsunuz, o zaman Laravel Lumen'i tercih edin. https://lumen.laravel.com/
  • 05-12-2018, 16:25:00
    #7
    bayGaReZ adlı üyeden alıntı: mesajı görüntüle
    Bu yöntem ile sayfalamayı siz yaparsınız, dolayısıyla nextpage, currentpage değerleri olmaz. örneğin siz her seferinde 10 adet eleman göndermek istiyorsunuz. Lazyload ile 5. sayfayı isteyen requesti attığınızda skip(4*10)->take(10)->get() demeniz yeterli. Yani:
    <?php
    $page = 1; // Query string ya da routing ile parametre olarak alabilirsiniz.
    $limit = 10;
    ..skip(($page-1)*$limit)->take($limit)->get();
    Affınıza sığınarak soruyorum, neden Lumen kullanmıyorsunuz? Mesajlarınızdan anladığım mobil uygulamaya api yazıyorsunuz, o zaman Laravel Lumen'i tercih edin. https://lumen.laravel.com/
    estf. hocam teşekkürler öneri ve yanıt için hemen bir inceleyeyim bu lumeni Laravel`de yeniyim hocam takip ettiğim dökümantasyonlardan baka baka ilerliyorum api yazmak için dolayısı ile bu şekilde sora sora yeni şeyler öğreniyoruz sayenizde Çok hızlı göz atıp anladığım kadarıyla sunucudan daha hızlı yanıt almayı mı sağlıyor hocam bu lumen ?
  • 05-12-2018, 16:31:07
    #8
    halilyc adlı üyeden alıntı: mesajı görüntüle
    estf. hocam teşekkürler öneri ve yanıt için hemen bir inceleyeyim bu lumeni Laravel`de yeniyim hocam takip ettiğim dökümantasyonlardan baka baka ilerliyorum api yazmak için dolayısı ile bu şekilde sora sora yeni şeyler öğreniyoruz sayenizde Çok hızlı göz atıp anladığım kadarıyla sunucudan daha hızlı yanıt almayı mı sağlıyor hocam bu lumen ?
    Micro-Framework, json output ile işiniz varsa view katmanınız ile işiniz yok demektir. View gibi bir çok şeyi de içinde barındırmayan yalnızca micro servisler yazacaksanız ve işiniz GET, POST requestler ile ise, Lumen tercih edin. (Bu arada ben Phalcon Micro Mvc kullanıcısıyım ama 2 projemde lumen kullandım.)

    Saniye başına yapacağı işlemden tutun da, harcadığı belleğe kadar çok avantaj sağlarsınız. Üstelik anlık mesajlaşma düşünüldüğü kadar basit bir altyapı olmadığı için performansa çok ihtiyacınız olacak. Bu arada tam olarak nasıl bir yapı kurguladınız bilmiyorum ama websocket teknolojisine, elasticsearch, redis gibi teknolojilere de bi göz atmanızı öneririm.
  • 05-12-2018, 16:40:27
    #9
    bayGaReZ adlı üyeden alıntı: mesajı görüntüle
    Micro-Framework, json output ile işiniz varsa view katmanınız ile işiniz yok demektir. View gibi bir çok şeyi de içinde barındırmayan yalnızca micro servisler yazacaksanız ve işiniz GET, POST requestler ile ise, Lumen tercih edin. (Bu arada ben Phalcon Micro Mvc kullanıcısıyım ama 2 projemde lumen kullandım.)

    Saniye başına yapacağı işlemden tutun da, harcadığı belleğe kadar çok avantaj sağlarsınız. Üstelik anlık mesajlaşma düşünüldüğü kadar basit bir altyapı olmadığı için performansa çok ihtiyacınız olacak. Bu arada tam olarak nasıl bir yapı kurguladınız bilmiyorum ama websocket teknolojisine, elasticsearch, redis gibi teknolojilere de bi göz atmanızı öneririm.
    Teşekkürler hocam Biraz inceledim micro olduğu için çoğu laravel componentlerini barındırmıyormuş misal session vb gibi. İşim malesef sadece api de değil, token için passport, session vb şeyleri de kullanıyorum Ayrıca sadece mobil uygulama olmayacak, web sitesi de hazırlanacak o yüzden bu proje için Laravel en doğru tercih gibi, ama lumen aklımda olsun basit mobil uygulamalar için kesinlikle çok işime yarayacaktır Şuanki proje twitter gibi bir micro-blog sosyal ağ olduğu için lumen yetersiz kalacaktır. Anlık mesajlaşma için websocket kullanıp sunucuya çok fazla yük bindirmek yerine pusher chatkit tercih ettim, şuan gayet iyi gidiyor sadece json çıktımı bir türlü paginate edemedim Gönderiler için bunu kullandım ve işimi gördü, ama yukarıdaki array içine entegre edemedim ->paginate(10) kısmını

    $posts = Post::with('User')->orderBy('created_at', 'DESC')->paginate(10);