Voor een lange tijd gebruik ik een singleton class om mijn database connectie te beheren. Vooral in PHP is dit een erg makkelijke oplossing aangezien gros van de applicaties die ik maak één database gebruiken. Toch twijfel ik nog aan de implementatie en op internet lees ik ook dat je singleton patroon moet vermijden. Echter zit ik dan te zoeken naar een mooie oplossing van doorgeven van database connectie(s). Of hoe je de connectie string moet doorgeven wanneer je iets van database A naar B wil kopieren, dan moet je dus eerst twee connecties openen en deze op een bepaalde manier weer tevoorschijn halen.
Een voorbeeld hoe ik nu mijn patroon toepas:
Deze oplossing is puur gemaakt voor één connectie. Wanneer ik iets van database A wil ophalen, verwerken en wegschrijven naar een andere database B dan zal deze oplossing totaal niet werken en zal ik de Save functie moeten herschrijven.
Nu kan ik een abstract model class maken, welke eigenlijk elke tabel in mijn database vertegenwoordigd.
De class news overerft model en heeft zodoende opslag voor de database connectie. Via de constructor kan ik deze doorgeven en verschillende database connecties kunnen gebruikt worden om items op te slaan. Echter vind ik het niet echt een mooie oplossing om steeds overal de database connectie door te moeten geven.
Na een tijdje te hebben rond gekeken zag ik de factory patroon. Zo kun je je model classes helemaal opbouwen, zodat deze zelfstandig in een applicatie kunnen werken (dus absoluut geen relatie hebben met een database) en in de factory kun je gebruik maken van database connecties. En hierdoor kwam ik op het volgende uit.
Op deze manier kan ik één instantie van een user ophalen van database A en zo doorsturen naar database B. Bij het voorbeeld hierboven waar de database connectie wordt doorgegeven zou ik een nieuwe instantie moeten maken en alle variabelen moeten overgeven. Ook niet echt handig. Dus kwa gebruiksvriendelijkheid zou ik zeggen dat deze mijn voorkeur heeft.
Nu komt alleen laatste punt, ik gebruik een MVC framework en ver in begin van de code maak ik de database connecties al aan aangezien de code daarna allemaal classes/functies induikt. Nu komt de vraag hoe krijg ik de connectie(s) toch beschikbaar ergens diep in de code? Waar voor mij het programmeren begint is in één van de functies van een controller. De frontcontroller is altijd beschrikbaar (nu bedenk ik mij net dat het komt omdat die ook een singleton is), maar goed dat is maar even zo. Is het dan verstandig om een Register class op te nemen waar ik global variabelen kan parkeren en op kan pikken wanneer ik deze nodig heb. Of zijn er betere implementaties om dit probleem op te lossen?
Een voorbeeld hoe ik nu mijn patroon toepas:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| class User { public $Firstname; public $Lastname; public function Save() { $db = Database::GetInstance(); // query opbouwen en verwerken. } } |
Deze oplossing is puur gemaakt voor één connectie. Wanneer ik iets van database A wil ophalen, verwerken en wegschrijven naar een andere database B dan zal deze oplossing totaal niet werken en zal ik de Save functie moeten herschrijven.
Nu kan ik een abstract model class maken, welke eigenlijk elke tabel in mijn database vertegenwoordigd.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
| abstract class Model { private $_Db; public function __construct($db) { $this->_Db = $db; } } class News extends Model { } |
De class news overerft model en heeft zodoende opslag voor de database connectie. Via de constructor kan ik deze doorgeven en verschillende database connecties kunnen gebruikt worden om items op te slaan. Echter vind ik het niet echt een mooie oplossing om steeds overal de database connectie door te moeten geven.
Na een tijdje te hebben rond gekeken zag ik de factory patroon. Zo kun je je model classes helemaal opbouwen, zodat deze zelfstandig in een applicatie kunnen werken (dus absoluut geen relatie hebben met een database) en in de factory kun je gebruik maken van database connecties. En hierdoor kwam ik op het volgende uit.
PHP:
1
2
3
4
5
6
7
| class UserFactory { public static function GetUserByID($id, $db) { } } |
Op deze manier kan ik één instantie van een user ophalen van database A en zo doorsturen naar database B. Bij het voorbeeld hierboven waar de database connectie wordt doorgegeven zou ik een nieuwe instantie moeten maken en alle variabelen moeten overgeven. Ook niet echt handig. Dus kwa gebruiksvriendelijkheid zou ik zeggen dat deze mijn voorkeur heeft.
Nu komt alleen laatste punt, ik gebruik een MVC framework en ver in begin van de code maak ik de database connecties al aan aangezien de code daarna allemaal classes/functies induikt. Nu komt de vraag hoe krijg ik de connectie(s) toch beschikbaar ergens diep in de code? Waar voor mij het programmeren begint is in één van de functies van een controller. De frontcontroller is altijd beschrikbaar (nu bedenk ik mij net dat het komt omdat die ook een singleton is), maar goed dat is maar even zo. Is het dan verstandig om een Register class op te nemen waar ik global variabelen kan parkeren en op kan pikken wanneer ik deze nodig heb. Of zijn er betere implementaties om dit probleem op te lossen?