[2009–12–28] Nette\Web\Session, expirace a verzování tříd

před 8 lety

David Grudl
founder | 6735
+
0
-

Nejprve musím zmínit tři body:

  1. v souvislosti s úpravou objektu Identity mohlo dojít k nepříjemnosti, pokud jste web předělali na novou Identity a v sessions zůstaly staré Identity.
  2. podobný problém může nastávat při změně jakékoliv třídy a je potřeba na něj myslet
  3. v poslední revizi došlo k modifikaci interní struktury, kterou Nette\Web\Session používá a po update frameworku se všechny sessions vyexpirují

Nejsem si jist, jestli třetí bod není problematický, pokud ano, bylo by možné do třídy Session doplnit detektor a konvertor staré struktury do nové. V tuto chvíli funguje spíše jako očistný mechanismus a eliminuje tak problém č.1.

Jenže k situacím, kdy se serializovaná třída změní a její data uložená někde ve staré session mohou vést k vytvoření chybného objektu, dochází poměrně často a mnohdy si to programátoři ani neuvědomují. Co s tím? Od aktuální revize podporuje Session verzování tříd. Stačí ve třídě uvést konstantu SERIALIZATION_VERSION anotaci @serializationVersion:

/**
 * @serializationVersion 123
 */
class ShoppingBasket
{
    ...
}

A při uložení objektu do proměnné jmenného prostoru session si Nette automaticky zapamatuje také hodnotu této anotace, tj. verzi třídy. Když se pak datová podoba třídy změní, stačí změnit číslo verze v konstantě a Nette bude staré objekty automaticky expirovat.

Stejně tak funguje i Nette\Caching.

Pokud by nedošlo k situaci viz bod 3, přidal bych třídě Identity tuto konstantu a přihlášení by uživatelům automaticky vypršelo.

před 8 lety

David Grudl
founder | 6735
+
0
-

A nebylo by lepší místo konstanty použít anotaci?

před 8 lety

Tomik
Nette Evangelist | 489
+
0
-

No, mě by se asi víc líbila anotace, ale asi se zase ozve pár lidí, že se jim anotace nelibí, a že chtějí alternativní způsob. :)

Jinak ta konstanta by se IMHO měla jmenovat jinak. Vždyť to určuje verzi datové struktury té třídy, sice to je pro serializaci, ale IMHO něco jako ARCHITECTURE_VERSION nebo STRUCTURE_VERSION by bylo lepší.

před 8 lety

Aurielle
Člen | 1283
+
0
-

Přidal bych do názvu konstanty N_ nebo NETTE_, protože nemusí hned být každému jasné, že ta konstanta spolupracuje s frameworkem a ne s danou třídou.

před 8 lety

Panda
Člen | 570
+
0
-

Pokud to má využívat Nette\Web\Session, tak bych tam možná dal místo NETTE_ prefix SESSION_, popř. N_SESSION_. Úplně ideální by bylo NETTE_WEB_SESSION_, ale pak název konstanty NETTE_WEB_SESSION_SERIALIZATION_VERSION by byl trošku… mno, řekněme delší.

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

Panda napsal(a):

Pokud to má využívat Nette\Web\Session, tak bych tam možná dal místo NETTE_ prefix SESSION_, popř. N_SESSION_. Úplně ideální by bylo NETTE_WEB_SESSION_, ale pak název konstanty NETTE_WEB_SESSION_SERIALIZATION_VERSION by byl trošku… mno, řekněme delší.

Myslím, že se tu bavíme obecně o všech potomcích Object :)

před 8 lety

David Grudl
founder | 6735
+
0
-

Konstanta přísluší konkrétní třídě a je pak věcí nástroje, jestli ji dokáže využít. Takže kromě Session k ní může přihlížet třeba i cache nebo obecně jakýkoliv serializační/deserializační nástroj mimo Nette.

před 8 lety

v6ak
Člen | 206
+
0
-

Taky bych byl spíš pro anotaci, pokud se zavedou striktní anotace, tak to bude lepší. Takto stačí malý přeťuk…

před 8 lety

Petr Motejlek
Člen | 293
+
0
-

Přesně tak, striktní anotace by to řešily naprosto báječně.