Oturumlar
HTTP durumsuz bir protokoldür; yine de neredeyse her uygulamanın istekler arasında bir durumu, örneğin alışveriş sepetinin içeriğini sürdürmesi gerekir. Oturumlar tam da bunun için kullanılır. Şunları göstereceğiz:
- oturumların nasıl kullanılacağı
- ad çakışmalarının nasıl önleneceği
- son kullanma süresinin nasıl ayarlanacağı
Oturum kullanıldığında her kullanıcı, bir çerezde aktarılan ve oturum ID'si denen benzersiz bir tanımlayıcı alır. Bu, oturum verisinin anahtarı görevini görür. Tarayıcı tarafında saklanan çerezlerin aksine, oturum verisi sunucu tarafında saklanır.
Oturumları yapılandırmada ayarlarız; özellikle son kullanma süresinin seçimi önemlidir.
Oturum yönetimini Nette\Http\Session nesnesi
üstlenir; ona, bağımlılık enjeksiyonuyla
aktarılmasını sağlayarak erişebilirsiniz. Presenter'larda yalnızca $session = $this->getSession()
çağırın.
Oturumu Başlatma
Nette varsayılan olarak, ondan veri okumaya ya da ona veri yazmaya başladığımız anda oturumu otomatik başlatır. Oturumu
elle başlatmak için $session->start() kullanın.
PHP, oturum başlatılırken önbelleklemeyi etkileyen HTTP header'larını (bkz. session_cache_limiter) ve olasılıkla oturum ID'sini taşıyan bir çerez gönderir. Bu yüzden oturumu, tarayıcıya herhangi bir çıktı göndermeden önce başlatmak her zaman gereklidir; aksi hâlde bir istisna fırlatılır. Yani sayfa render edilirken bir oturumun kullanılacağını biliyorsanız, onu önceden elle, örneğin presenter'da başlatın.
Geliştirici kipinde Tracy oturumu başlatır; çünkü onu Tracy Bar'da yönlendirmeler ve AJAX istekleri için çubuk göstermekte kullanır.
Bölümler
Saf PHP'de oturum verisi deposu, genel $_SESSION değişkeniyle erişilen bir dizi olarak gerçekleştirilir.
Sorun şu ki uygulamalar tipik olarak pek çok bağımsız parçadan oluşur ve hepsinin elinde tek bir dizi varsa, er ya da geç
bir ad çakışması olur.
Nette Framework bu sorunu, tüm alanı bölümlere (Nette\Http\SessionSection nesneleri) ayırarak çözer. Her birim böylece benzersiz adı olan kendi bölümünü kullanır ve hiçbir çakışma olamaz.
Bir bölümü oturumdan alırız:
$section = $session->getSection('benzersiz ad');
Presenter'da yalnızca getSession() metodunu bir parametreyle kullanın:
// $this bir Presenter'dır
$section = $this->getSession('benzersiz ad');
Bir bölümün varlığı $session->hasSection('benzersiz ad') metoduyla denetlenebilir. Var olan tüm
bölümlerin adlarının listesini $session->getSectionNames() döndürür.
Bölümün kendisiyle çalışmak set(), get() ve remove() metotlarıyla çok
kolaydır:
// bir değişken yazma
$section->set('userName', 'john');
// bir değişkeni okuma, yoksa null döndürür
echo $section->get('userName');
// bir değişkeni kaldırma
$section->remove('userName');
Bir bölümdeki tüm değişkenleri almak için bir foreach döngüsü kullanabilirsiniz:
foreach ($section as $key => $val) {
echo "$key = $val";
}
Son Kullanma Nasıl Ayarlanır
Son kullanma, tek tek bölümler ve hatta tek tek değişkenler için ayarlanabilir. Bir kullanıcının oturumunun 20 dakika sonra sona ermesini sağlarken, alışveriş sepetinin içeriğini anımsamayı sürdürebiliriz.
// bölüm 20 dakika sonra sona erer
$section->setExpiration('20 minutes');
Tek tek değişkenler için son kullanmayı ayarlamak amacıyla set() metodunun üçüncü parametresini
kullanın:
// 'flash' değişkeni 30 saniye sonra sona erer
$section->set('flash', $message, '30 seconds');
Oturumun tamamının son kullanma süresinin (bkz. oturum yapılandırması) tek tek bölümler ya da değişkenler için ayarlanan süreye eşit ya da ondan büyük olması gerektiğini unutmayın.
Daha önce ayarlanmış bir son kullanmayı iptal etmek için removeExpiration() metodunu kullanın; belirli bir
değişkenin son kullanmasını temizlemek için onun adını verin: removeExpiration('flash'). Bölümün tamamını
hemen kaldırmak için remove() metodunu kullanın.
$onStart, $onBeforeWrite Olayları
Nette\Http\Session nesnesinin $onStart ve $onBeforeWrite olayları vardır; böylece oturum başladıktan sonra ya da diske
yazılıp ardından sonlandırılmadan önce çağrılan callback'ler ekleyebilirsiniz.
$session->onBeforeWrite[] = function () {
// veriyi oturuma yaz
$this->section->set('basket', $this->basket);
};
Oturum Yönetimi
Oturum yönetimi için Nette\Http\Session sınıfının metotlarına genel bakış:
start(): void
Oturumu başlatır.
isStarted(): bool
Oturum başlatıldı mı?
close(): void
Oturumu sonlandırır. Oturum, betiğin çalışması bittiğinde otomatik olarak sonlanır.
destroy(): void
Oturumu sonlandırır ve siler.
exists(): bool
HTTP isteği oturum ID'si taşıyan bir çerez içeriyor mu?
regenerateId(): void
Yeni ve rastgele bir oturum ID'si üretir. Veri korunur.
getId(): string
Oturum ID'sini döndürür.
Yapılandırma
Oturumu yapılandırmada ayarlarız. DI container kullanmayan bir uygulama yazıyorsanız, yapılandırma için bu metotları kullanın. Oturumu başlatmadan önce çağrılmalıdırlar.
setName (string $name): static
Oturum ID'sinin aktarıldığı çerezin adını ayarlar. Standart ad PHPSESSID'dir. Bu, aynı web sitesinde
birkaç farklı uygulama çalıştırıyorsanız yararlıdır.
getName(): string
Oturum ID'sinin aktarıldığı çerezin adını döndürür.
setOptions (array $options): static
Oturumu yapılandırır. Tüm PHP oturum yönergelerini
(camelCase biçiminde, örneğin session.save_path yerine savePath yazın) ve ayrıca readAndClose
seçeneğini ayarlamak olanaklıdır.
setExpiration (?string $expire): static
Oturumun sona ereceği hareketsizlik süresini ayarlar.
setCookieParameters (string $path, ?string $domain=null, ?bool $secure=null, SameSite|string|null $samesite=null): static
Çerezler için parametreleri ayarlar. Varsayılan parametre değerlerini yapılandırmada değiştirebilirsiniz.
setSavePath (string $path): static
Oturum dosyalarının saklandığı dizini ayarlar.
setHandler (\SessionHandlerInterface $handler): static
Özel bir handler ayarlar, bkz. PHP belgeleri.
Önce Güvenlik
Sunucu, istekler aynı oturum ID'siyle geldiği sürece aynı kullanıcıyla iletişim kurduğunu varsayar. Güvenlik düzeneklerinin görevi, bunun gerçekten böyle olduğunu ve tanımlayıcının çalınamayacağını ya da değiştirilemeyeceğini güvence altına almaktır.
Bu yüzden Nette Framework, PHP yönergelerini oturum ID'sini yalnızca çerezlerde aktaracak, JavaScript'ten erişilemez kılacak ve URL'deki tanımlayıcıları yok sayacak şekilde doğru yapılandırır. Üstelik kullanıcı girişi gibi kritik anlarda yeni bir oturum ID'si üretir.
PHP'yi yapılandırmak için ini_set fonksiyonu kullanılır, ama ne yazık ki bazı barındırma
sağlayıcıları onun kullanımını yasaklar. Barındırmanızda durum böyleyse, bu fonksiyonu size açmalarını ya da hiç
değilse sunucuyu düzgün yapılandırmalarını ayarlamayı deneyin.