session / manager
Ik heb een tijdje terug al eens eerder een vraag gesteld over Sessions en een Session Manager. Omdat ik het nu ga programmeren wil ik er nog even op terug komen.
Eerder is mij verteld dat je iedere sessie (= ieder key/value paar uit de $_SESSION array) moet opslaan in een aparte Sessie class.
Nu heb ik ook een soort ParameterBag class gemaakt en vraag ik me af waarom ik niet ALLE sessie waarden in één zo'n class zou opslaan.
Als ik zoiets zou doen:
$session = new ParameterBag($_SESSION);
echo $session->get('username');
Wat is daar dan niet goed aan? Waarom moet zo'n sessie key/vale pair in een aparte class worden opgeslagen, en waarom heb je een Session Manager nodig?
Kan iemand mij het waarom uitleggen, en ook hoe zo'n Session Class en Session Manager eruit moeten zien? En hoe ze onderling met elkaar verband houden?
Alvast dank!
(Ik weet dat sommige aspecten hiervan al eerder aan bod zijn gekomen, maar ik wil het graag even op een rijtje hebben in dit topic, zodat ik precies snap hoe ik het moet programmeren).
Gewijzigd op 20/02/2013 19:41:26 door Ozzie PHP
Ozzie PHP op 20/02/2013 19:39:47:
Eerder is mij verteld dat je iedere sessie (= ieder key/value paar uit de $_SESSION array) moet opslaan in een aparte Sessie class
Niet om het een of ander, maar waarom staan iedere key+value in een array denk je?
$_SESSION is toch gewoon een array?
Jij wilt dus een array met classes krijgen die elk 1 key/value bevatten? Dus een extra moeilijke tussenlaag inbouwen?
Wat zou het voordeel moeten zijn van $session->class->key = 'value' boven $_SESSION['key'] = 'value'?
Eddy, dat is dus ook precies mijn vraag! Mijn vraag is waarom je ieder key/value paar in een aparte Session class moet opslaan.
Maar goed, ik OOP niet.
Oké, ik wacht even wat meer reacties af. Wellicht kan Wouter nog wat duidelijkheid verschaffen.
Laten we eerst het begrip 'session' uit pluizen. Een session is een stukje opgeslagen tekst dat voor een bepaalde korte tijd opgeslagen is in een database.
In het flat PHP kom je voornamelijk 1 versie van Sessions tegen en dat is de standaard PHP methode voor het afhandelen van sessies: Doormiddel van een array en cookies.
Maar er zijn natuurlijk nog veel meer mogelijkheden om data kort op te slaan. Denk bijv. aan opslaan in een bestandje of zelfs in een database (PdoSessionHandler).
We zien dus dat sessies op veel verschillende plekken terug gaan komen en daarom vindt ik het mooi om 1 Session klasse te maken, waardoor we deze altijd kunnen hergebruiken in onze code.
Ik heb dus een soort parameterbag gemaakt waarin ik bijv. de POST en GET variabelen zet. Nu kan ik hier ook de $_SESSION variabelen inzetten, maar jij zei destijds dat ik dan de set() functie moest veranderen en de sessie telkens in een Session class moest stoppen. Iedere sessie (key/value paar) krijgt dan z'n eigen sessie class. Mijn vraag is wat dan precies de meerwaarde ervan is om die sessie in een aparte class te stoppen. Wat zou zo'n class bijvoorbeeld kunnen, wat met de parameterbag niet kan? Dat is wat ik graag zou willen begrijpen.
Ik doe dit niet puur met de sessie array, maar met cookies. Iedere app moet dan z'n eigen application key hebben, en vervolgens maakt mcrypt een unieke hash aan voor zo'n cookie om de inhoud ervan te beveiligen natuurlijk. In zo'n cookie namespace (naam kan je zelf instellen) kan je dan dingen writen en removen.
Oké Raoul, maar om het niet nog ingewikkelder te maken... laten we het even uitsluitend bij de $_SESSION houden. Ik zou gewoon zeggen: ik stop de hele $_SESSION array in 1 class, maar ik ben benieuwd waarom Wouter ieder key/value paar uit de array in een aparte class zet.
Omdat je dus niet altijd de session als een verzameling moet zien, maar ook als individuele objectjes die je ergens kunt opslaan. Dat je het nu in een array stopt heeft niks met de gedachte te maken, OO schrijf je om vooruit te denken en rekening te houden met het feit dat je Sessions ook op andere manieren kunt gaan gebruiken.
Stel nu, ik stop die hele $_SESSION in een parameterbag. In het ene geval stop ik alle waarden in een array $parameters en in het andere geval (jouw voorkeur) stop in alle waarden in een eigen class. Wat kun je dan in jouw situatie méér dan in de eerste situatie. Kun je een paar concrete voorbeelden noemen?
Nu ik er over nadenk (zoals Wouter hier tegenaan kijkt deed ik nog niet), zou je ieder aparte session variabele zichzelf kunnen laten opslaan. Stel je hebt elke waarde in een apart object zitten. Dan kan je die hele array van objectjes doorlopen en tegen ze zeggen: sla op. Zelf weten ze hoe en waar en voila, geen extra logica meer nodig.
Dat zou toch ook kunnen als je ze rechtstreeks in de $_SESSION array opslaat? Of als je ze eerst in een aparte array opslaat, dan daarna die hele array opslaan? Of begrijp ik even niet wat je bedoelt nu?
Als je elke waarde in zijn eigen object plaatst (en die objecten in een array), dan weten die objecten nog steeds waar ze de data weer moeten opslaan.
Maar goed, dit is gewoon een gedachte die ik had, zit verder geen 'ervaring' achter. Wouter kan er vast meer over zeggen.
Deze waarden worden opgeslagen in een array binnen de class. We hebben dus 6 afzonderlijke classes.
Nu zei Wouter dat je de waarden uit de $_SESSION array niet rechtstreeks in een array moet opslaan, maar dat je er eerst een class van moet maken en die zet je dan weer in die array.
Stel je hebt 20 key/value paren in de $_SESSION array zitten. Met een key/value paar bedoel ik bijv. "username" => "Erwin H". Ik zou dan die 20 paren rechtstreeks in de array zetten. Wouter zou echter die 20 waarden eerst in een class zetten en die 20 classes dan opslaan in de array. Ik ben dus benieuwd naar het waarom.
1 of 6, het blijft dat je het hebt voorgedefinieerd in je class en je dus niet flexibel bent. Als er een 7e mogelijkheid bijkomt (bijvoorbeeld sessie data dat in je eigen database zit), dan moet je je class gaan aanpassen.
Ik snap niet wat je bedoelt met "1 of 6, het blijft dat je het hebt voorgedefinieerd in je class en je dus niet flexibel bent."
Ozzie PHP op 20/02/2013 23:58:10:
Nu zei Wouter dat je de waarden uit de $_SESSION array niet rechtstreeks in een array moet opslaan, maar dat je er eerst een class van moet maken en die zet je dan weer in die array.
Stel je hebt 20 key/value paren in de $_SESSION array zitten. Met een key/value paar bedoel ik bijv. "username" => "Erwin H". Ik zou dan die 20 paren rechtstreeks in de array zetten. Wouter zou echter die 20 waarden eerst in een class zetten en die 20 classes dan opslaan in de array. Ik ben dus benieuwd naar het waarom.
Nu zei Wouter dat je de waarden uit de $_SESSION array niet rechtstreeks in een array moet opslaan, maar dat je er eerst een class van moet maken en die zet je dan weer in die array.
Stel je hebt 20 key/value paren in de $_SESSION array zitten. Met een key/value paar bedoel ik bijv. "username" => "Erwin H". Ik zou dan die 20 paren rechtstreeks in de array zetten. Wouter zou echter die 20 waarden eerst in een class zetten en die 20 classes dan opslaan in de array. Ik ben dus benieuwd naar het waarom.
Ik denk niet dat Wouter de 20 paren afzonderlijk in een class zou zetten en vervolgens in een array. Dit is althans niet hoe symfony werkt.
Om het voorbeeld van symfony maar aan te houden.
Ze doen het daar ongeveer zo:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
class Session
{
private $values = array();
public function set($name, $value)
{
$this->values[$name] = $value;
}
}
{
private $values = array();
public function set($name, $value)
{
$this->values[$name] = $value;
}
}
Je kunt dan vervolgens doen:
$session = new Session();
$session->set('naam', 'Ozzie');
echo $session->get('naam');
In symfony heet de values property $storage.
Je kunt dan in de constructor verschillende storage classes opgeven die elk op hun eigen manier het opslaan van de sessie waardes afhandelen.
Je kunt zo op een nette OOP manier je sessies implementeren.
Gewijzigd op 24/02/2013 14:15:17 door B de Zwaan
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
public function set($name, $value)
{
$this->values[$name] = new SessionClass($name, $value);
}
?>
public function set($name, $value)
{
$this->values[$name] = new SessionClass($name, $value);
}
?>
En daarom begrijp ik dus ook niet zo goed wat hier de meerwaarde van is. Ik zou het zelf ook doen zoals jij zegt, dus alle sessie key/value paren opslaan in een array.
P.S.
Wat bedoel je met "Je kunt dan in de constructor verschillende storage classes opgeven die elk op hun eigen manier het opslaan van de sessie waardes afhandelen." Kun je een voorbeeld geven?
Wat B (Bart?!) de Zwaan bedoeld is dat je via de constructor kan aangeven waar de session data opgeslagen wordt. Database, memcached, file based (default), etc. Wellicht zit ik ernaast maar dan corrigeert hij me wel ;) Zend Framework heeft deze mogelijkheid ook. Het opslaan wordt dan ook in een bepaalde class geregeld welke een interface daarvoor implementeert.
@Ozzie: Ik geef je graag nog wat uitgebreider uitleg, maar kan iemand mij vertellen hoe ik netjes code voorbeelden invoer? Ik zal er wel dik overheen kijken maar ik zie de functie niet.