Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Yazı Tipi BoyutlandırıcıAa
  • Anasayfa
  • Teknoloji
    • Siber Güvenlik
    • Yapay Zeka
    • Donanım
    • Bilim
  • Yazılım
  • Savunma & İstihbarat
  • Oyun
  • Yaşam
    • Finans
    • Sinema
    • Dünyadan Haberler
  • İş Birliği
Okuma: Offline-Öncelikli Kontrol: Venue Wi-Fi’sine Dayanıklı Bir Laravel API’si
Paylaş
Yazı Tipi BoyutlandırıcıAa
Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Ara
Bizi Takip Et
  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti
© 2026 Teknomers. All Rights Reserved.

Anasayfa » Offline-Öncelikli Kontrol: Venue Wi-Fi’sine Dayanıklı Bir Laravel API’si

Yazılım

Offline-Öncelikli Kontrol: Venue Wi-Fi’sine Dayanıklı Bir Laravel API’si

teknomers
Son güncelleme: 5 Temmuz 2026 07:50
teknomers
Paylaş
Paylaş


TL;DR

  • Bir bilet kontrol uygulaması canlı Wi-Fi’ye bağımlı olamaz: taramalar çevrimdışı çalışmalı ve daha sonra senkronize edilmelidir.
  • Dört uç nokta işlev görüyor: manifest indirme, idempotent toplu gönderim, delta çekme, çevrimiçi arama.
  • Müşteri tarafından oluşturulan UUID’ler + benzersiz bir indeks, yeniden denemelerin güvenli olmasını sağlar. Duplicatlar bir başarı durumu olup hata değildir.
<h2>
    <a name="the-problem" href="#the-problem"></a>
    Problemin Tanımı
</h2>
<p>Fiziksel bir etkinlikte, personel kapıda biletleri tararken, mekanın Wi-Fi'sinin güvenilirliği tahmin ettiğiniz gibi. Eğer API'niz her taramanın sıcak yolunda yer alıyorsa, kapıdaki kuyruk, binanın en kötü sinyal çubuğu hızında büyümektedir.</p>
<p>Tasarımı böylece tersine çeviriyoruz: <strong>cihaz check-in'i, sunucu ise uzlaşmayı sahipleniyor.</strong> Kasiyerin kasası kapandığında bir kağıt defteri tutmasına benzer — şimdi kaydet, daha sonra uzlaştır.</p>

<h2>
    <a name="the-api-surface" href="#the-api-surface"></a>
    API Arayüzü
</h2>
<div class="table-wrapper-paragraph">
    <table>
        <thead>
            <tr>
                <th>Uç Nokta</th>
                <th>Amacı</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><code>GET /staff/events/{uuid}/manifest</code></td>
                <td>kapı açılmadan önce indirilen sayfalandırılmış bilet özeti</td>
            </tr>
            <tr>
                <td><code>POST /staff/events/{uuid}/check-ins/batch</code></td>
                <td>kuyrukta bekleyen taramaları gönder; yeniden denemek güvenlidir</td>
            </tr>
            <tr>
                <td><code>GET /staff/events/{uuid}/check-ins?since=<cursor/></code></td>
                <td>diğer cihazların yaptığı taramaları al</td>
            </tr>
            <tr>
                <td><code>GET /staff/events/{uuid}/participants?q=</code></td>
                <td>çevrimiçi yedek arama (kaybolan bilet, yazım hatası)</td>
            </tr>
        </tbody>
    </table>
</div>

<h2>
    <a name="the-sync-loop" href="#the-sync-loop"></a>
    Senkronizasyon Döngüsü
</h2>
<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code>Device                                   Server

|— GET manifest (before event) ——->|
| scan offline, queue locally |
|— POST batch [{client_uuid, ts}] —->| dedupe on client_uuid
|| scans from other devices
|

<h2>
    <a name="idempotency-is-the-whole-trick" href="#idempotency-is-the-whole-trick"></a>
    Idempotency Tüm Sır
</h2>
<p>Her tarama, <strong>tarama zamanında cihazda üretilen bir UUID</strong> alır. Sunucu buna benzersiz bir indeks koyar ve ekler veya yok sayar:</p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="k">public</span> <span class="k">function</span> <span class="n">batchCheckIn</span><span class="p">(</span><span class="kt">BatchCheckInRequest</span> <span class="nv">$request</span><span class="p">,</span> <span class="kt">string</span> <span class="nv">$uuid</span><span class="p">):</span> <span class="kt">JsonResponse</span>

{
$results = collect($request->validated(‘check_ins’))->map(function (array $scan) {
$checkIn = CheckIn::firstOrCreate(
[‘client_uuid’ => $scan[‘client_uuid’]],
[‘ticket_id’ => / resolved from scan /, ‘checked_in_at’ => $scan[‘scanned_at’]],
// …
);
return [
‘client_uuid’ => $scan[‘client_uuid’],
‘status’ => $checkIn->wasRecentlyCreated ? <span class=”s1>’applied’ : <span class=”s1>’duplicate’,
];
});

<span class="k">return</span> <span class="nf">response</span><span class="p">()</span><span class="o">-&gt;</span><span class="nf">json</span><span class="p">([</span><span class="s1>'results'</span> <span class="o">=&gt;</span> <span class="nv">$results</span><span class="p">]);</span>

}

<p>Önemli tasarım kararı: <strong>bir duplicat hata değildir.</strong> Bağlantıyı kaybeden bir cihaz tüm partiyi yeniden göndermelidir — bu normal bir işlemdir, bir istisna değildir. 200 yanıtı döndürüyoruz, nesneyi <code>duplicate</code> olarak işaretliyoruz ve devam ediyoruz. İlk check-in kazanır.</p>
<p>İki zaman damgası önemlidir: <code>scanned_at</code> cihazdan alınan iş değeri ("bu kişi ne zaman girdi") iken, sunucunun kendi zamanı sıralamayı yönlendirir. Cihaz saatleri yalan söyler; senkronizasyon işaretçesini onlara dayandırmayın.</p>

<h2>
    <a name="delta-pull" href="#delta-pull"></a>
    Delta Çekme
</h2>
<p>Diğer cihazlar da insanları kontrol ediyor. <code>GET /check-ins?since=<cursor/></code> istemcinin görmediği her şeyi döndürür; yerel duruma birleştirilir ve işaretçi ilerletilir. İşaretçi sunucu tarafı zamanından gelir bu nedenle her cihazın saatinin ne kadar yanlış olduğu önemli değildir.</p>

<h2>
    <a name="test-the-retry-not-the-happy-path" href="#test-the-retry-not-the-happy-path"></a>
    Yeniden Denemeyi Test Et, Mutlu Yolu değil
</h2>
<p>Mutlu yol çalışacaktır. Yeniden deneme, çevrimdışı-öncelikli tasarımların gizlice kırıldığı alandır:</p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><span class="nf">it</span><span class="p">(</span><span class="s1>'applies the same batch twice without double check-ins'</span><span class="p">,</span> <span class="k">function</span> <span class="p">()</span> <span class="p">{</span>
        <span class="nv">$payload</span> <span class="o">=</span> <span class="p">[</span><span class="s1>'check_ins'</span> <span class="o">=&gt;</span> <span class="p">[[</span>
            <span class="s1>'client_uuid'</span> <span class="o">=&gt;</span> <span class="nv">$uuid</span> <span class="o">=</span> <span class="nc">Str</span><span class="o">::</span><span class="nf">uuid</span><span class="p">()</span><span class="o">-&gt;</span><span class="nf">toString</span><span class="p">(),</span>
            <span class="s1>'code'</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">ticket</span><span class="o">-&gt;</span><span class="n">code</span><span class="p">,</span>
            <span class="s1>'scanned_at'</span> <span class="o">=&gt;</span> <span class="nf">now</span><span class="p">()</span><span class="o">-&gt;</span><span class="nf">toIso8601String</span><span class="p">(),</span>
        <span class="p">]]];</span>
        <span class="nf">postJson</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="n">endpoint</span><span class="p">,</span> <span class="nv">$payload</span><span class="p">)</span><span class="o">-&gt;</span><span class="nf">assertOk</span><span class="p">()</span>
            <span class="o">-&gt;</span><span class="nf">assertJsonPath</span><span class="p">(</span><span class="s1>'results.0.status'</span><span class="p">,</span> <span class="s1>'applied'</span><span class="p">);</span>

        <span class="nf">postJson</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="n">endpoint</span><span class="p">,</span> <span class="nv">$payload</span><span class="p">)</span><span class="o">-&gt;</span><span class="nf">assertOk</span><span class="p">()</span>
            <span class="o">-&gt;</span><span class="nf">assertJsonPath</span><span class="p">(</span><span class="s1>'results.0.status'</span><span class="p">,</span> <span class="s1>'duplicate'</span><span class="p">);</span>

        <span class="nf">expect</span><span class="p">(</span><span class="nc">CheckIn</span><span class="o">::</span><span class="nf">where</span><span class="p">(</span><span class="s1>'client_uuid'</span><span class="p">,</span> <span class="nv">$uuid</span><span class="p">)</span><span class="o">-&gt;</span><span class="nb">count</span><span class="p">())</span><span class="o">-&gt;</span><span class="nf">toBe</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">});</span></code></pre>
</div>

<h2>
    <a name="takeaway" href="#takeaway"></a>
    Çıkarımlar
</h2>
<p>Çevrimdışı öncelikli tasarım, sunucunun her eylemin kapı bekçisi olma görevini, durum uzlaştırıcısı haline getirir. Ve buna, iki can sıkıcı özellik ile ulaşırsınız — kararlı müşteri tarafından üretilen kimlikler ve monoton sunucu tarafı işaretçileri — akıllı çelişki çözümlemeleriyle değil.</p>

Kaynak: Orijinal Makale

Laravel ile Üretim Hazır RESTful API’ler Oluşturma: Kimlik Doğrulama, Oran Sınırlama ve Sürümleme
Laravel’i Ticari Projelerde Kullanmayı Neden Bırakmalısınız (Gizli Riskler)
Laravel Cloud’u Denemek – Laravel Barındırma için Uygulamalı Rehber, Başlangıç Fiyatı $5
Ödeme Sistemleri Mimarisi — Laravel Entegratöründen Ekip Düzeyindeki Mimaraya
Laravel AI SDK: Uygulamanıza 20 Dakikada Metinden Sese ve Ses Ekleme
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale Geliştirici Günlüğü: 2026-07-04
Sonraki Makale Ayaklarınızın Altında Gizli Bir Fungal Ağ: İlk Tam Harita Keşfedildi!

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

Rusya’nın en büyük bankası Sberbank, Aralık’a kadar kripto ticareti altyapısı kurmayı planlıyor
Finans
Microsoft, PC için Xbox 360 emülatörü sundu; modüler çözümlerle oyunlar çalıştı.
Donanım
Hafıza mükemmel, ancak uygulama yavaş kalıyordu.
Yazılım
Elon Musk’ın Boring Şirketi Dev Bir Yatırım Sürecine Girdi
Genel
Manhwa Legends İçin Temmuz 2026 Kodu Rehberi
Oyun
Vatikano’nun ‘Click to Pray’ uygulamasında güvenlik açığı var
Donanım
//

Siber güvenlik, yapay zeka ve savunma sanayiinden; finans ve sinema dünyasına uzanan geniş bir yelpaze. Teknomers; teknoloji, strateji ve yazılım dünyasını sade bir dille sizlerle buluşturuyor.

Kurumsal

  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti

Kategoriler

  • Teknoloji
  • Oyun
  • Sinema
  • Siber Güvenlik
  • Bilim
  • Finans
  • Dünyadan Güncel Haberler

Populer

  • TV'de Ücretsiz İzlenebilen Şifresiz Erotik Kanallar (2025 Güncel Frekans Listesi)

  • The Last of Us PC Kontrolleri: Hızlı Silah Değiştirme ve Tüm Tuşlar (2025)

  • Hogwarts Legacy'de Odaklanma İksiri Nasıl Yapılır?

Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Bizi Takip Et
© 2026 Teknomers. All Rights Reserved.
Welcome Back!

Sign in to your account

Kullanıcı Adı veya E-posta Adresi
Şifre

Şifrenizi mi unuttunuz?