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.

Kurulum ve gereksinimler

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.

versiyon: 4.x