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 Ara Katmanını Anlamak — İsteklerin Uygulamanızda Nasıl Seyahat Ettiği
Laravel’de Ek Yük Olmadan Hata İzleme Kurulumu
Laravel Alt Alan Adı Rotalarında Kök Alan Adı URL’leri Oluşturma: UrlGenerator’ı Kopyala
WhatsApp Medyasını Medya Kimliği Kullanarak İndirme ve Kaydetme (WhatsApp Cloud API) – Laravel ve Core PHP ile
Basit Bir E-ticaret Sepeti Oluşturmanın Kıdemli Laravel Mühendisliği Hakkında Bana Öğrettikleri
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale Geliştirici Günlüğü: 2026-07-04

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

Geliştirici Günlüğü: 2026-07-04
Yazılım
Donanım meraklıları için: Dijital PlayStation’a karşı birleşen şirketler
Donanım
Afrika’da PHP/Laravel Uygulamaları için Yapay Zeka Destekli WAF Oluşturuldu — İşte Kapadığı Tehditler
Yazılım
Oyun PC’sini oturma odası fanının içine gizledi: Dreo soğutma çözümü
Donanım
Google’ın Yeni Reklamı: AI ile Yazılan Bağımsızlık Bildirgesi
Yapay Zeka
3D Baskılı Nükleer Reaktör Modülüyle AI Veri Merkezleri Güçlenecek
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?