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

- David Grudl
- Nette Core | 8285
Nejprve musím zmínit tři body:
- 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.
- podobný problém může nastávat při změně jakékoliv třídy a je potřeba na něj myslet
- 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 anotaci
SERIALIZATION_VERSION@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.

- Tomik
- Nette Evangelist | 485
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ší.

- Ondřej Mirtes
- Člen | 1536
Panda napsal(a):
Pokud to má využívat
Nette\Web\Session, tak bych tam možná dal místoNETTE_prefixSESSION_, popř.N_SESSION_. Úplně ideální by byloNETTE_WEB_SESSION_, ale pak název konstantyNETTE_WEB_SESSION_SERIALIZATION_VERSIONby byl trošku… mno, řekněme delší.
Myslím, že se tu bavíme obecně o všech potomcích
Object :)

- David Grudl
- Nette Core | 8285
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.