[2009–12–28] Nette\Web\Session, expirace a verzování tříd
- David Grudl
- Nette Core | 8227
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_VERSION
by 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 | 8227
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.