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:
$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)| Depo | Kime ait | Ömrü | Ne taşır |
|---|---|---|---|
$app.globals | uygulamaya | süreç boyu | veri (JSON'dan geçer) |
$app.request.globals | o anki isteğe | istek bitince yok olur | veri |
$app.services | uygulamaya | süreç boyu | canlı nesne |
session | kullanıcıya | oturum boyu | veri (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:
$app.globals.provider = $redisVarsayı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#
$app.request.globals.set("kullanici", $user) # kimlik doğrulama katmanı
$user = $app.request.globals.get("kullanici") # sayfa / parçaAyrı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.
$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:
$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:
$app.globals.set("sayac", 0) # HER İSTEKTE yeniden 0 yaparDosya 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:
if not $app.globals.has("sayac") then
$app.globals.set("sayac", 0)
end ifAçı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.