İçeriğe geç
LexerLangv0.1.0

Durum yönetimi

globals, request.globals ve services — veri ile canlı nesne arasındaki fark.

Üç ayrı depo var ve bilerek karıştırılmıyorlar:

LexerLang
$app.globals.set("site_adi", "Satış Katla")     # veri, süreç boyu
$app.request.globals.set("kullanici", $user)    # veri, yalnızca bu istek

$redis = $app.services.once("redis", func()     # canlı nesne, süreç boyu
    return new redis({host: "localhost", port: 6379}).connect()
end func)
DepoKime aitÖmrüNe taşır
$app.globalsuygulamayasüreç boyuveri (JSON'dan geçer)
$app.request.globalso anki isteğeistek bitince yok olurveri
$app.servicesuygulamayasüreç boyucanlı nesne
sessionkullanıcıyaoturum boyuveri (Redis'te)

globals#

ÇağrıEtkisi
.set($ad, $deger)yazar
.get($ad) · .get($ad, $varsayilan)okur
.has($ad)var mı
.delete($ad)siler

Depolama değiştirilebilir, çağrılar değişmez:

LexerLang
$app.globals.provider = $redis

Varsayılan bellektir; Redis zorunlu değildir. Redis anahtarları lexer:global:<ad> ad alanına yazılır.

Değerler her iki depoda da JSON'dan geçer. Aksi halde sağlayıcı değişince aynı kod bozulurdu: bellekten canlı nesne, Redis'ten JSON metni dönerdi. Bu yüzden globals bir veritabanı bağlantısı taşıyamaz.

request.globals#

LexerLang
$app.request.globals.set("kullanici", $user)     # kimlik doğrulama katmanı
$user = $app.request.globals.get("kullanici")    # sayfa / parça

Ayrım olmasaydı "o anki kullanıcı" gibi bir değer yanlışlıkla uygulama genelinde — hatta Redis'te — durur ve bir sonraki isteğe sızardı.

globals uygulamaya, session kullanıcıya aittir. İkisi farklı sorulara yanıt verir.

services#

globals veri taşır; services canlı nesne taşır.

LexerLang
$redis = $app.services.once("redis", func()
    return new redis({host: "localhost", port: 6379}).connect()
end func)

once verilen fonksiyonu yalnızca ilk çağrıda çalıştırır. Sonraki her istekte aynı örnek döner:

LexerLang
$redis = $app.services.get("redis")

Bağlantı bir kez kurulur ve her dosya aynı örneğe ulaşır — istek başına yeniden bağlanmanın maliyeti ortadan kalkar.

Sayfa her istekte baştan çalışıyor#

Bu, durum yazarken akılda tutulması gereken tek şey:

LexerLang
$app.globals.set("sayac", 0)      # HER İSTEKTE yeniden 0 yapar

Dosya her istekte baştan yürütüldüğü için bu satır da her istekte çalışır. Bir kez kurulması gereken şeyler için services.once ya da bir varlık denetimi gerekir:

LexerLang
if not $app.globals.has("sayac") then
    $app.globals.set("sayac", 0)
end if

Açılışta bir kez kurulup süreç boyu okunan ağır değerler (arama dizini gibi) globals'ta tutulur — ama onları kuran kodun da yalnızca bir kez çalıştığından emin olun.

Sırada#

Kaçışlama.