Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Yapmak istediğim şey dış bağlantıları saymak. Nerede yanlış yapıyorum.

linteki kod :
onclick='linksay( {{$fee->id}} )'

ajax kodum

<script>
    $('a').click(function linksay(val)
   {
        evt.preventDefault();
        var link = $(this).attr('href');
        id = $('a').val();
        $.ajax({
            method: get,
            url: '/linksay'+ id,
            data: {
                'id': val
          }
        });
    });
    </script>

route kodum

Route::get('/linksay',  [FeedController::class, 'linksay'])->name('front.linksay');

controller kodum

public function linksay(Request $request){

    $request->id;
    $say = Feed::findOrFail($id);
    $say->tiklasay+=1;
    $say->save();


    return Redirect::to($say->url);
}

    A.click yaparsanız sayfada bulunan herhangi bir a elementinin click eventini yakalarsınız. Ancak siz zaten onclick kullandığınız için a.click methodunu kullanmaniza gerek yok, teknik olarak burada hata yapmışsınız. Bunun haricinde bir tabloda bir değerin belirli bir sütununu arttırmak istiyorsanız +1 ve ardından save yapmaniza gerek yok. Bunun yerine $say->increment('tiklasay') yapmanız yeterli

    aeneas İçerik içerisinde kaç tane dış bağlantı var onu mu tespit etmek istiyorsunuz yoksa bir dış bağlantıya kaç kere tıklandığını mı? Js kodunuz geçerli bir js kodu değil, amacınız ile yazdığınız kod da çok farklı işler yapıyor.

    Dış bağlantıya kaç kere tıklandıgını hocam, bende fark ettim kodun yapmak istedigimle alakası olmaamıs 🙂

    hocam çalıştırmayı başardım, fakat son kodumda return redirect()->away($say->url); CORS ERROR hatası veriyor.

      aeneas Çünkü ajax ile istek atıyorsunuz ama yönlendirmeyi backend tarafında yapmaya çalışıyorsunuz. Şöyle olabilir:

      <a href="[dış link]" data-feed="{{ $fee->id }}"></a>
      Route::get('/linksay/{id}',  [FeedController::class, 'linksay'])->name('front.linksay');
      public function linksay($id)
      {
          Feed::findOrFail($id)
              ->increment('tiklasay');
          
          return response()->noContent();
      }
      $(function() {
          $('a[data-feed]').click(function(e) {
              e.preventDefault();
      
              let feedId = $(this).data('feed');
              let href = $(this).attr('href');
      
              $.ajax({
                  type: 'GET',
                  url: '/linksay/' + feedId,
                  success: function(resp) {
                      window.location.href = href;
                  }
              });
          });
      });

      hocam Allah razı olsun yine sayende cözdüm.

      localde 1,5 saniye gibi bekletiyor. 1,5 saniye ciddi bir süre. Hocam controlleri mı bekliyor, ajax kodlarımı 1.5 sanıye suruyor. Hızlandırmak için ne yapmak lazım.
      Kodları aşağıda paylaşıyorum, birilerinin işine yaraya bilir.

      blade içinde link

      <button href="{{ $fee->url }}" id="{{$fee->id}}" class="hover:underline" target="_blank">{{ $fee->baslik }}</button>

      blade içinde js

      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
      <script>
          $("button").click(function(e){
              e.preventDefault();
         var dataId = (this.id);
         let href = $(this).attr('href');
              $.ajax({
                  url : "{{ route('front.linksay') }}",
                  type: 'POST',
                  dataType: "json",
                  data: {
              "_method": 'POST',
              "id": dataId,
              "_token":   '{{ csrf_token() }}',
            },
            success: function(resp) {
              window.open( href, '_blank');
                  }
              });
          });
          </script>

      controller

      public function linksay(Request $request){
      
         $id = $request->id;
          $say = Bot::find($id);
      
          $say->tiklasay+=1;
         $kaydet = $say->save();
      
         return response()->noContent();;
      }

      rota

      Route::post('/linksay',  [FeedController::class, 'linksay'])->name('front.linksay');

        aeneas Laravel'i nasıl çalıştırıyorsunuz bilmiyorum ama yavaş olmasının sebebi geliştirme ortamınızla alakalı olabilir.

          mgsmus katılıyorum ayrıca size increment methodunu onerdigimiz halde hala tiklasay+=1 şeklinde kullanmaya devam etmeniz üzücü

          @ragmus Hocam ne haddime siz değerli hocalarımın veridi kodları kullanmamak. Fakat ->increment('tiklasay'); yapınca hata veriyor.
          LOG.error: Call to a member function increment() on null { "exception": {} }

            aeneas Bot::find($id); yapıyorsunuz, bulursa Bot modelini verecek ama bulamazsa null dönecek, null döndüğü zaman ne yapılması gerekiyor yazmıyorsunuz, o yüzden uygulama null dönen durumda kırılıyor. Ben ise örnekte özellikle findOrFail kullandım.

            Hocam bir de a etiket kullandıgımdan sayfadaki tum a etiketleri etkilenmis. onu class icinde link e bağladım findorfail olarakda değişirdim. birde loader ekledim. Birde rate limiter ekledim. şuan çok iyi çalışıyor ellerinize sağlık. Nihai kodları aşağıda paylaşıyorum.

            ROUTE

            Route::post('/linksay',  [FeedController::class, 'linksay'])->name('front.linksay')->middleware(['throttle:ajaxlimit']);

            CONTROLLER

            public function linksay(Request $request){
            
               $id = $request->id;
                $say = Bot::findOrFail($id)->increment('tiklasay');
               return response()->noContent();;
            }

            JS

            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
            <script>
                $(document).on("click", '.link', function(e){
                    e.preventDefault();
               var dataId = (this.id);
               let href = $(this).attr('href');
                    $.ajax({
                        url : "{{ route('front.linksay') }}",
                        type: 'POST',
                        data: {
                    "_method": 'POST',
                    "id": dataId,
                    "_token":   '{{ csrf_token() }}',
                  },
                  success: function(resp) {
                    window.open( href, '_blank');
                        },
                        error: function(xhr, status, error, resp) {
            
              alert('Bir hata oluştu. Çok fazla sayıda deneme yapmış olabilirsiniz.');
            }
                    });
                });
            
                $(document).on({
                ajaxStart: function(){
                    $("body").addClass("loading");
                },
                ajaxStop: function(){
                    $("body").removeClass("loading");
                }
            });
                </script>

            STYLE

             <style>
                        .overlay{
                            display: none;
                            position: fixed;
                            width: 100%;
                            height: 100%;
                            top: 0;
                            left: 0;
                            z-index: 999;
                            background: rgba(255,255,255,0.6) url("{{ asset('image/loader.gif') }}") center no-repeat;
                        }
                        /* Turn off scrollbar when body element has the loading class */
                        body.loading{
                            display: block;
                        }
                        /* Make spinner image visible when body element has the loading class */
                        body.loading .overlay{
                            display: block;
                        }
                        </style>

            LİNK ÖRNEĞİ

            <a href="{{ $fee->url }}" id="{{$fee->id}}" class="link hover:underline" target="_blank">{{ $fee->baslik }}</a>

            LOADER DİV

            <div class="overlay"></div>

            RATE LİMİTER

            RateLimiter::for('ajaxlimit', function (Request $request) {
                        return $request->user()
                                    ? Limit::perMinute(20)->by($request->user()->id)
                                    : Limit::perMinute(10)->by($request->ip());
                    });