Nette Documentation Preview

syntax
Oturumlar
*********

<div class=perex>

HTTP durumsuz bir protokoldür, ancak neredeyse her uygulamanın istekler arasında durum tutması gerekir, örneğin bir alışveriş sepetinin içeriği. Oturum bunun için kullanılır. Bakalım

- oturumlar nasil kullanilir
- adlandirma çatişmalarindan nasil kaçinilir
- son kullanma tari̇hi̇ nasil ayarlanir

</div>

Oturumları kullanırken, her kullanıcı oturum kimliği adı verilen ve bir çerezde aktarılan benzersiz bir tanımlayıcı alır. Bu, oturum verilerinin anahtarı olarak işlev görür. Tarayıcı tarafında saklanan çerezlerin aksine, oturum verileri sunucu tarafında saklanır.

[Yapılandırmada |configuration#session] oturumu [yapılandırırız |configuration#session], sona erme süresinin seçimi önemlidir.

Oturum, [bağımlılık enjeksiyonu |dependency-injection:passing-dependencies] kullanarak aktardığınız [api:Nette\Http\Session] nesnesi tarafından yönetilir. Sunucularda `$session = $this->getSession()` adresini çağırmanız yeterlidir.

→ [Kurulum ve gereksinimler |@home#Installation]


Başlangıç Oturumu .[#toc-starting-session]
==========================================

Varsayılan olarak, Nette bir oturumdan okumaya veya ona veri yazmaya başladığımız anda otomatik olarak bir oturum başlatacaktır. Bir oturumu manuel olarak başlatmak için `$session->start()` adresini kullanın.

PHP, oturumu başlatırken önbelleğe almayı etkileyen HTTP başlıkları gönderir, bkz. [php:session_cache_limiter], ve muhtemelen oturum kimliğini içeren bir çerez. Bu nedenle, tarayıcıya herhangi bir çıktı göndermeden önce oturumu başlatmak her zaman gereklidir, aksi takdirde bir istisna fırlatılır. Bu nedenle, sayfa oluşturma sırasında bir oturumun kullanılacağını biliyorsanız, oturumu daha önce manuel olarak, örneğin sunucuda başlatın.

Geliştirici modunda, Tracy oturumu başlatır çünkü Tracy Bar'da yeniden yönlendirme ve AJAX istekleri çubuklarını görüntülemek için kullanır.


Bölüm .[#toc-section]
=====================

Saf PHP'de oturum veri deposu, `$_SESSION` global değişkeni aracılığıyla erişilebilen bir dizi olarak uygulanır. Sorun şu ki, uygulamalar normalde bir dizi bağımsız parçadan oluşur ve hepsinde yalnızca aynı dizi mevcutsa, er ya da geç bir isim çakışması meydana gelecektir.

Nette Framework bu sorunu tüm alanı bölümlere ayırarak çözer (nesneler [api:Nette\Http\SessionSection]). Her birim daha sonra benzersiz bir adla kendi bölümünü kullanır ve hiçbir çarpışma meydana gelmez.

Bölümü oturum yöneticisinden alıyoruz:

```php
$section = $session->getSection('unique name');
```

Sunucuda `getSession()` adresini parametre ile çağırmak yeterlidir:

```php
// $this Sunucu
$section = $this->getSession('unique name');
```

Kesitin varlığı `$session->hasSection('unique name')` yöntemi ile kontrol edilebilir.

Bölümün kendisiyle `set()`, `get()` ve `remove()` yöntemlerini kullanarak çalışmak çok kolaydır:

```php
// değişken yazımı
$section->set('userName', 'franta');

// bir değişkeni okuma, mevcut değilse null döndürür
echo $section->get('userName');

// değişken kaldırma
$section->remove('userName');
```

Tüm değişkenleri bölümden elde etmek için `foreach` döngüsünü kullanmak mümkündür:

```php
foreach ($section as $key => $val) {
	echo "$key = $val";
}
```


Son Kullanma Tarihi Nasıl Ayarlanır .[#toc-how-to-set-expiration]
-----------------------------------------------------------------

Süre sonu, tek tek bölümler ve hatta tek tek değişkenler için ayarlanabilir. Kullanıcının oturum açma süresinin 20 dakika içinde sona ermesine izin verebiliriz, ancak yine de bir alışveriş sepetinin içeriğini hatırlayabiliriz.

```php
// bölüm 20 dakika sonra sona erecektir
$section->setExpiration('20 minutes');
```

`set()` yönteminin üçüncü parametresi, bireysel değişkenlerin sona erme süresini ayarlamak için kullanılır:

```php
// 'flash' değişkeninin süresi 30 saniye sonra dolar
$section->set('flash', $message, '30 seconds');
```

.[note]
Tüm oturumun sona erme süresinin (bkz. oturum [yapılandırması |configuration#session]) tek tek bölümler veya değişkenler için ayarlanan süreye eşit veya daha yüksek olması gerektiğini unutmayın.

Daha önce ayarlanmış olan sürenin iptali `removeExpiration()` yöntemi ile gerçekleştirilebilir. Tüm bölümün derhal silinmesi `remove()` yöntemi ile sağlanacaktır.


Olaylar $onStart, $onBeforeWrite .[#toc-events-onstart-onbeforewrite]
---------------------------------------------------------------------

Object `Nette\Http\Session` `$onStart` a `$onBeforeWrite`[olaylarına |nette:glossary#Events] sahiptir, böylece oturum başladıktan sonra veya diske yazılıp sonlandırılmadan önce çağrılan geri aramalar ekleyebilirsiniz.

```php
$session->onBeforeWrite[] = function () {
	// oturuma veri yazma
	$this->section->set('basket', $this->basket);
};
```


Oturum Yönetimi .[#toc-session-management]
==========================================

Oturum yönetimi için `Nette\Http\Session` sınıfının yöntemlerine genel bakış:

<div class=wiki-methods-brief>


start(): void .[method]
-----------------------
Bir oturum başlatır.


isStarted(): bool .[method]
---------------------------
Oturum başladı mı?


close(): void .[method]
-----------------------
Oturumu sonlandırır. Oturum, komut dosyasının sonunda otomatik olarak sona erer.


destroy(): void .[method]
-------------------------
Oturumu sonlandırır ve siler.


exists(): bool .[method]
------------------------
HTTP isteği oturum kimliğine sahip bir çerez içeriyor mu?


regenerateId(): void .[method]
------------------------------
Yeni bir rastgele oturum kimliği oluşturur. Veriler değişmeden kalır.


getId(): string .[method]
-------------------------
Oturum kimliğini döndürür.

</div>


Konfigürasyon .[#toc-configuration]
-----------------------------------

Oturumu [yapılandırmada yapılandırıyoruz |configuration#session]. DI konteyneri kullanmayan bir uygulama yazıyorsanız, yapılandırmak için bu yöntemleri kullanın. Oturum başlatılmadan önce çağrılmalıdırlar.

<div class=wiki-methods-brief>


setName(string $name): static .[method]
---------------------------------------
Oturum kimliğini iletmek için kullanılan çerezin adını ayarlar. Varsayılan ad `PHPSESSID` şeklin</div>dedir.<div class=wiki-methods-brief>Bu, aynı sitede birkaç farklı uygulama çalıştırıyorsanız kullanışlıdır.


getName(): string .[method]
---------------------------
Oturum çerezinin adını döndürür.


setOptions(array $options): static .[method]
--------------------------------------------
Oturumu yapılandırır. Tüm PHP [oturum yönergelerini |https://www.php.net/manual/en/session.configuration.php] ayarlamak (camelCase biçiminde, örneğin `session.save_path` yerine `savePath` yazmak) ve ayrıca [readAndClose |https://www.php.net/manual/en/function.session-start.php#refsect1-function.session-start-parameters] yapm</div>ak<div class=wiki-methods-brief>mümkündür.


setExpiration(?string $time): static .[method]
----------------------------------------------
Oturumun sona ereceği hareketsizlik süresini ayarlar.


setCookieParameters(string $path, string $domain=null, bool $secure=null, string $samesite=null): static .[method]
------------------------------------------------------------------------------------------------------------------
Çerezler için parametreleri ayarlar. Varsayılan parametre değerlerini [configuration#Session cookie |configuration#Session cookie] bölümünden değiştirebilirsiniz.


setSavePath(string $path): static .[method]
-------------------------------------------
Oturum dosyalarının depolandığı dizini ayarlar.


setHandler(\SessionHandlerInterface $handler): static .[method]
---------------------------------------------------------------
Özel işleyici ayarlar, [PHP belgelerine |https://www.php.net/manual/en/class.sessionhandlerinterface.php] bakınız.

</div>


Önce Güvenlik .[#toc-safety-first]
==================================

Sunucu, istekler aynı oturum kimliğini içerdiği sürece aynı kullanıcıyla iletişim kurduğunu varsayar. Güvenlik mekanizmalarının görevi, bu davranışın gerçekten çalıştığından ve bir tanımlayıcıyı değiştirme veya çalma olasılığının olmadığından emin olmaktır.

Bu nedenle Nette Framework, oturum kimliğini yalnızca çerezlerde aktarmak, JavaScript'ten erişimi önlemek ve URL'deki tanımlayıcıları yok saymak için PHP yönergelerini uygun şekilde yapılandırır. Dahası, kullanıcı girişi gibi kritik anlarda yeni bir Oturum Kimliği oluşturur.

PHP'yi yapılandırmak için ini_set işlevi kullanılır, ancak ne yazık ki bazı web barındırma hizmetlerinde kullanımı yasaktır. Eğer sizin durumunuz buysa, barındırma sağlayıcınızdan bu işleve izin vermesini ya da en azından sunucusunu düzgün bir şekilde yapılandırmasını isteyin. .[note]

Oturumlar

HTTP durumsuz bir protokoldür, ancak neredeyse her uygulamanın istekler arasında durum tutması gerekir, örneğin bir alışveriş sepetinin içeriği. Oturum bunun için kullanılır. Bakalım

  • oturumlar nasil kullanilir
  • adlandirma çatişmalarindan nasil kaçinilir
  • son kullanma tari̇hi̇ nasil ayarlanir

Oturumları kullanırken, her kullanıcı oturum kimliği adı verilen ve bir çerezde aktarılan benzersiz bir tanımlayıcı alır. Bu, oturum verilerinin anahtarı olarak işlev görür. Tarayıcı tarafında saklanan çerezlerin aksine, oturum verileri sunucu tarafında saklanır.

Yapılandırmada oturumu yapılandırırız, sona erme süresinin seçimi önemlidir.

Oturum, bağımlılık enjeksiyonu kullanarak aktardığınız Nette\Http\Session nesnesi tarafından yönetilir. Sunucularda $session = $this->getSession() adresini çağırmanız yeterlidir.

Kurulum ve gereksinimler

Başlangıç Oturumu

Varsayılan olarak, Nette bir oturumdan okumaya veya ona veri yazmaya başladığımız anda otomatik olarak bir oturum başlatacaktır. Bir oturumu manuel olarak başlatmak için $session->start() adresini kullanın.

PHP, oturumu başlatırken önbelleğe almayı etkileyen HTTP başlıkları gönderir, bkz. session_cache_limiter, ve muhtemelen oturum kimliğini içeren bir çerez. Bu nedenle, tarayıcıya herhangi bir çıktı göndermeden önce oturumu başlatmak her zaman gereklidir, aksi takdirde bir istisna fırlatılır. Bu nedenle, sayfa oluşturma sırasında bir oturumun kullanılacağını biliyorsanız, oturumu daha önce manuel olarak, örneğin sunucuda başlatın.

Geliştirici modunda, Tracy oturumu başlatır çünkü Tracy Bar'da yeniden yönlendirme ve AJAX istekleri çubuklarını görüntülemek için kullanır.

Bölüm

Saf PHP'de oturum veri deposu, $_SESSION global değişkeni aracılığıyla erişilebilen bir dizi olarak uygulanır. Sorun şu ki, uygulamalar normalde bir dizi bağımsız parçadan oluşur ve hepsinde yalnızca aynı dizi mevcutsa, er ya da geç bir isim çakışması meydana gelecektir.

Nette Framework bu sorunu tüm alanı bölümlere ayırarak çözer (nesneler Nette\Http\SessionSection). Her birim daha sonra benzersiz bir adla kendi bölümünü kullanır ve hiçbir çarpışma meydana gelmez.

Bölümü oturum yöneticisinden alıyoruz:

$section = $session->getSection('unique name');

Sunucuda getSession() adresini parametre ile çağırmak yeterlidir:

// $this Sunucu
$section = $this->getSession('unique name');

Kesitin varlığı $session->hasSection('unique name') yöntemi ile kontrol edilebilir.

Bölümün kendisiyle set(), get() ve remove() yöntemlerini kullanarak çalışmak çok kolaydır:

// değişken yazımı
$section->set('userName', 'franta');

// bir değişkeni okuma, mevcut değilse null döndürür
echo $section->get('userName');

// değişken kaldırma
$section->remove('userName');

Tüm değişkenleri bölümden elde etmek için foreach döngüsünü kullanmak mümkündür:

foreach ($section as $key => $val) {
	echo "$key = $val";
}

Son Kullanma Tarihi Nasıl Ayarlanır

Süre sonu, tek tek bölümler ve hatta tek tek değişkenler için ayarlanabilir. Kullanıcının oturum açma süresinin 20 dakika içinde sona ermesine izin verebiliriz, ancak yine de bir alışveriş sepetinin içeriğini hatırlayabiliriz.

// bölüm 20 dakika sonra sona erecektir
$section->setExpiration('20 minutes');

set() yönteminin üçüncü parametresi, bireysel değişkenlerin sona erme süresini ayarlamak için kullanılır:

// 'flash' değişkeninin süresi 30 saniye sonra dolar
$section->set('flash', $message, '30 seconds');

Tüm oturumun sona erme süresinin (bkz. oturum yapılandırması) tek tek bölümler veya değişkenler için ayarlanan süreye eşit veya daha yüksek olması gerektiğini unutmayın.

Daha önce ayarlanmış olan sürenin iptali removeExpiration() yöntemi ile gerçekleştirilebilir. Tüm bölümün derhal silinmesi remove() yöntemi ile sağlanacaktır.

Olaylar $onStart, $onBeforeWrite

Object Nette\Http\Session $onStart a $onBeforeWriteolaylarına sahiptir, böylece oturum başladıktan sonra veya diske yazılıp sonlandırılmadan önce çağrılan geri aramalar ekleyebilirsiniz.

$session->onBeforeWrite[] = function () {
	// oturuma veri yazma
	$this->section->set('basket', $this->basket);
};

Oturum Yönetimi

Oturum yönetimi için Nette\Http\Session sınıfının yöntemlerine genel bakış:

start(): void

Bir oturum başlatır.

isStarted(): bool

Oturum başladı mı?

close(): void

Oturumu sonlandırır. Oturum, komut dosyasının sonunda otomatik olarak sona erer.

destroy(): void

Oturumu sonlandırır ve siler.

exists(): bool

HTTP isteği oturum kimliğine sahip bir çerez içeriyor mu?

regenerateId(): void

Yeni bir rastgele oturum kimliği oluşturur. Veriler değişmeden kalır.

getId(): string

Oturum kimliğini döndürür.

Konfigürasyon

Oturumu yapılandırmada yapılandırıyoruz. DI konteyneri kullanmayan bir uygulama yazıyorsanız, yapılandırmak için bu yöntemleri kullanın. Oturum başlatılmadan önce çağrılmalıdırlar.

setName(string $name): static

Oturum kimliğini iletmek için kullanılan çerezin adını ayarlar. Varsayılan ad PHPSESSID şeklin
dedir.
Bu, aynı sitede birkaç farklı uygulama çalıştırıyorsanız kullanışlıdır.

getName(): string

Oturum çerezinin adını döndürür.

setOptions(array $options)static

Oturumu yapılandırır. Tüm PHP oturum yönergelerini ayarlamak (camelCase biçiminde, örneğin session.save_path yerine savePath yazmak) ve ayrıca readAndClose yapm
ak
mümkündür.

setExpiration(?string $time)static

Oturumun sona ereceği hareketsizlik süresini ayarlar.

setCookieParameters(string $path, string $domain=null, bool $secure=null, string $samesite=null)static

Çerezler için parametreleri ayarlar. Varsayılan parametre değerlerini configuration#Session cookie bölümünden değiştirebilirsiniz.

setSavePath(string $path)static

Oturum dosyalarının depolandığı dizini ayarlar.

setHandler(\SessionHandlerInterface $handler)static

Özel işleyici ayarlar, PHP belgelerine bakınız.

Önce Güvenlik

Sunucu, istekler aynı oturum kimliğini içerdiği sürece aynı kullanıcıyla iletişim kurduğunu varsayar. Güvenlik mekanizmalarının görevi, bu davranışın gerçekten çalıştığından ve bir tanımlayıcıyı değiştirme veya çalma olasılığının olmadığından emin olmaktır.

Bu nedenle Nette Framework, oturum kimliğini yalnızca çerezlerde aktarmak, JavaScript'ten erişimi önlemek ve URL'deki tanımlayıcıları yok saymak için PHP yönergelerini uygun şekilde yapılandırır. Dahası, kullanıcı girişi gibi kritik anlarda yeni bir Oturum Kimliği oluşturur.

PHP'yi yapılandırmak için ini_set işlevi kullanılır, ancak ne yazık ki bazı web barındırma hizmetlerinde kullanımı yasaktır. Eğer sizin durumunuz buysa, barındırma sağlayıcınızdan bu işleve izin vermesini ya da en azından sunucusunu düzgün bir şekilde yapılandırmasını isteyin.