Ik werd vanochtend wakker, en ineens was ik de kluts kwijt. Vorige week dacht ik dat ik het begreep, maar nu weet ik het weer even niet. Is er één iemand hier op het forum die het mij goed kan uitleggen, want ik word er gek van. Het ene moment denk ik het te snappen, en nu ineens dus weer niet.
Waar gaat het over?
Als ik vroeger iets wilde opslaan in de $_SESSION array, dan gebruikte ik daar een "SessionManager" class voor. Als ik iets in de $_SESSION array wilde zetten, dan deed ik dat als volgt:
<?php
$sm = $container->get('session_manager');
$sm->set('user', 'Ozzie');
// ergens anders de waarde ophalen:
echo 'hallo ' . $sm->get('user');
?>
Nu werd hier op het forum gezegd dat dit geen flexibele oplossing is. Stel dat ik voortaan mijn session data niet meer op wil slaan in de $_SESSION array maar in de database, dan zou dat met mijn oplossing erg lastig worden.
De betere oplossing was, volgens enkele leden op het forum, deze:
We stoppen de key en value niet meer rechtstreeks in de SessionManager, maar we stoppen ze eerst in een apart Session object. Daarna geven we dat Session object door aan de SessionManager en de SessionManager slaat de data op in de $_SESSION array, of in de database (afhankelijk van het type SessionManager).
Precies hetzelfde voorbeeld als hierboven, maar nu met de opzet die enkele leden hier op het forum aanraden:
<?php
$sm = $container->get('session_manager');
$session = new Session();
$session->setId('user');
$session->setValue('Ozzie');
$sm->update($session);
// ergens anders de waarde ophalen:
$session = $sm->get('user');
echo 'hallo ' . $session->getValue();
?>
Zoals je ziet vergt deze methode meer typwerk. Maar goed, als het een meerwaarde heeft dan valt daar iets voor te zeggen. Alleen mijn vraag is wat deze meerwaarde nu eigenlijk is.
Het idee van mensen die voorstander zijn van deze laatste methode, is dat je enkel door de SessionManager class te wijzigen, je al je sessie data in één keer ergens anders kunt opslaan. Bijvoorbeeld, door in plaats van een SessionManager te gebruiken die alles in de $_SESSION array opslaat, gebruik je een SessionManager die alles in de database opslaat, en voila... alle session data wordt in de database opgeslagen.
Prima, goed idee! Klinkt goed.
Maar nu mijn kritische noot. Waarom zou datzelfde niet op "mijn" manier kunnen? Als je de SessionManager class in het eerste voorbeeld wijzigt door een SessionManager class die de sessie data in een database kan opslaan, dan heb je toch precies hetzelfde effect? (Met een interface dwing je af dat een SessionManager altijd dezelfde methods heeft.)
De Session class in het 2e voorbeeld heeft de volgende methods: getId(), setId(), getValue() en setValue().
Dus een object met 4 methodes enkel om een ID => value paar op te slaan. Waarom? Het enige wat de SessionManager hoeft te weten is: WAT moet ik opslaan (de value) en onder welke ID. Waarom gaan we rondom deze basale informatie dan een aparte class bouwen? Waarom zeggen we niet rechtstreeks tegen de SessionManager, dit is de ID en dit is de value. Waarom moet daar een hele class of container omheen worden gebouwd die we vervolgens doorgeven aan de SessionManager, en waar de SessionManager vervolgens de ID en value weer uithaalt? Waarom niet direct de ID en value aan de SessionManager doorgeven?
Wie kan het mij uitleggen? Ik zie blijkbaar iets over het hoofd, maar ik zou zo graag weten wat...
Wie helpt me uit de brand?
1.755 views