Hallo medetweakers,
Ik zit al tijden met een "probleem" die ik probeer te doorgronden. Ik heb de afgelopen maanden ontzettend veel over design patterns gelezen. Globaal snap ik het allemaal wel maar de uitvoering is niet heel erg uitgebreid besproken op het weg (wat betreft PHP). Er zijn eigenlijk twee tutorials (PHPit en PHPpro) die tevens vol met fouten staan. Goed; het is een duidelijk opgezet 'iets' maar nou niet echt rocket science. Nu wil ik mijn ervaring in de zoektocht tot MVC gaan bundelen in een tutorial. Nu is het wel fijn dat je het meteen goed aanpakt natuurlijk
Ik heb ontzettend veel 'designvragen' die ik wil doorgronden. Nu zijn er ongetwijveld mensen die dit proces hebben doorlopen en een hoop tips hebben 
Allereerst de directorystructuur. Allereerst wil ik even melden dat ik op dit moment niet met public & private mappen werk. Dit kan natuurlijk wel omdat alles aangesproken wordt vanuit één punt (index.php). Maar goed, laten we het nu even niet moeilijker maken dan dat het is
De structuur die ik (wil) toepassen:
Simpele structuur. Je kan alle dynamische zut nog in /private zetten en static en index in /public. Maar goed, daar gaat het niet helemaal om atm
Doormiddel van een FrontController wordt de controller opgesnort en geïnitializeerd. Hier wordt naar de url gekeken. Als voorbeeld:
De FrontController kijkt of de controller gastenboek bestaat met de method view, zoniet schakeld hij naar de standaard controller en laat dan gewoon de index pagina zien. Niet héél fancy en erg basic. Ik zal voor het gemak even de FrontController posten:
De comments zijn duidelijk en spreken voor zich lijkt mij. Ook vrij simpel om te zien wat de FrontController al wel (en niet) doet
En hier strand ik meteen. Als ik uitga van de cakephp documentatie wordt er in de controller gezocht naar de juiste model+view. Ik zit te twijvelen; moet dat echt in de controller of kan dat ook al in de FrontController. Immers weet ik nu al dat er een controller aangesproken gaat worden als hij bestaat met een bepaalde actie en ik weet ook dat er een model+view bij hoort. Nu zal mijn denkwijze tot op de grond afgebrand kunnen worden denk ik.
Ik kan héél simpel in de controller kijken hoe de class heet en dan het model+view openen met dezelfde naam als het ware. Maar is dit wel de goede manier? Kortom: Hoe nu verder kwa denkwijze en ontwerpkeuzes.
Dan heb ik ook nog een aantal 'losse' vraagjes die ik niet kon vinden (of wel kon vinden maar ernstig twijvelde aan de waarheid daarvan).
Zo heb ik een class Authenticate. Deze kan bijvoorbeeld zien of er een user is ingelogt, welke rechten erbij horen etc. Nu dacht ik dat dat iets is wat vaak terugkomt en dat je die het beste als 'lib' kan inladen. Aan de andere kant dacht ik als je bijvoorbeeld een forum hebt dat je toch query's hebt die appbased zijn maar waar userrechten zwaar in verwikkeld zijn. In hoeverre moet ik dit apart gaan zien? Is het erg dat er op een bepaald moment een query in het model zit die bijvoorbeeld gelijk op userrechten controlleerd. Vanuit 'gevoel' zou je zeggen dat dat in Authenticate class moet afgehandeld worden maar dan denk ik meteen; eey, je hebt een serieuze ontwerpfout. Bij dit soort dingen is overzicht natuurlijk super belangrijk en het uittekenen van bepaalde zaken. Desalniettemin een ontzettend leerzaam project waar ik ontzettend veel van ga leren en al geleerd heb.
De database class (/lib) wil ik zo klein mogelijk houden. En vooral niet met Singleton werken (lijkt mij ook een ontwerpfout omdat je maar één keer kan initializeren lijkt mij (één instance)). Dus dan wordt het vooral kwa functionaliteit: Querys ophalen, Prepared Statements etc. Die wil ik dan ook zo compact mogelijk houden en ook zo algemeen mogelijk. Dus de corefuncties.
Ik denk dat er véle wegen naar rome zijn maar ik denk ook dat heel veel wegen foutief zijn. Ik denk ook dat een hoop tweakers hier een mening over hebben en ik hoop dan ook dat andere mensen hier ook weer van kunnen leren.
Als disclaimer wil ik wel even zeggen dat dit om een leerprojectje gaat. Denkwijze verbreden etc. Ja ik kan ook gewoon een willekeurig MVC-framework downloaden maar ik kies ervoor om kleinschalig iets zelf te maken om bepaalde dingen te begrijpen. Reacties met 'Download gewoon een framework en concentreer je op de echte problemen' vind ik dan ook niet geheel op zijn plaats. Denk zeg het maar even vooraf
Ik zit al tijden met een "probleem" die ik probeer te doorgronden. Ik heb de afgelopen maanden ontzettend veel over design patterns gelezen. Globaal snap ik het allemaal wel maar de uitvoering is niet heel erg uitgebreid besproken op het weg (wat betreft PHP). Er zijn eigenlijk twee tutorials (PHPit en PHPpro) die tevens vol met fouten staan. Goed; het is een duidelijk opgezet 'iets' maar nou niet echt rocket science. Nu wil ik mijn ervaring in de zoektocht tot MVC gaan bundelen in een tutorial. Nu is het wel fijn dat je het meteen goed aanpakt natuurlijk
Allereerst de directorystructuur. Allereerst wil ik even melden dat ik op dit moment niet met public & private mappen werk. Dit kan natuurlijk wel omdat alles aangesproken wordt vanuit één punt (index.php). Maar goed, laten we het nu even niet moeilijker maken dan dat het is
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| /libs/ /libs/FrontController.class.php // Frontcontroller, spreekt Controller dus aan /libs/TemplateParser.class.php // Templateparser, spreekt voor zich /libs/Authenticate.class.php // User Authenticate class voor userzaken (login,rechten etc) /libs/db.class.php // Database class (PDO) /libs/Registry.class.php // set+get+unset functions, spreekt voor zich /app/ /app/__APPNAME__/ /app/__APPNAME__/static/ /app/__APPNAME__/static/html // html templates /app/__APPNAME__/static/js // javascript files /app/__APPNAME__/static/css // css fles /app/__APPNAME__/static/img // images /app/__APPNAME__/controllers // controllers /app/__APPNAME__/models // models /app/__APPNAME__/views // views /conf/ |
Simpele structuur. Je kan alle dynamische zut nog in /private zetten en static en index in /public. Maar goed, daar gaat het niet helemaal om atm
Doormiddel van een FrontController wordt de controller opgesnort en geïnitializeerd. Hier wordt naar de url gekeken. Als voorbeeld:
code:
1
| http://domain.tld/index.php/gastenboek/view |
De FrontController kijkt of de controller gastenboek bestaat met de method view, zoniet schakeld hij naar de standaard controller en laat dan gewoon de index pagina zien. Niet héél fancy en erg basic. Ik zal voor het gemak even de FrontController posten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| <?php class FrontController { /** * * @param array $aParts * @param string $sController * @param string $sAction * * @desc De FrontController kijkt de PATH_INFO na en zet deze in een array. * @desc Met deze info wordt de goede controller aangesproken. * */ private $aParts = array(); public function __construct () { if ( isset ( $_SERVER['PATH_INFO'] ) ) { /** * Er wordt gekeken wat er in de URL staat na index.php * Voorbeeld: http://www.domain.tld/index.php/guestbook/viewmessages * $parts = array ( [0] => guestbook, [1] => viewmessages ); * Dit wil zeggen dat guestbook de controller is en viewmessages de actie. */ $aParts = explode ('/', strtolower ( trim ( $_SERVER['PATH_INFO'], '/' ) ) ); /** * Hier wordt de inhoud van $parts in $sController en $sAction gezet. * Als er iets niet klopt wordt de standaard pagina opgehaald. */ $sController = ( current ( $aParts ) ) ? array_shift ( $aParts ) : 'default'; $sAction = ( current ( $aParts ) ) ? array_shift ( $aParts ) : 'index'; } else { /** * De PATH_INFO is niet geset, daarom halen we de normale index op. */ $sController = 'default'; $sAction = 'index'; } /** * $sController en $sAction worden nu aan de dispatcher meegegeven. * De dispatcher gaat uiteindelijk echt de controller aanspreken */ $this->dispatch ( $sController, $sAction ); } public function dispatch ( $sController, $sAction) { if ( file_exists ( 'app/'. __APPNAME__ .'controllers/' . $sController . '.class.php' ) ) { /** * Het bestand bestaat dus we gaan hem includen * $sControllername bevat de naam van de controller */ require_once ( 'app/' . __APPNAME__ . 'controllers/'. $sController . '.class.php' ); $sControllername = ucfirst ($sController) . 'Controller'; /** * Nu gaan we kijken of de classe ook echt bestaat. * Zoniet vallen we gewoon weer terug op de index pagina. * We gaan meteen kijken of de actie ook bestaat. * Als hij bestaat voeren we hem ook meteen uit. */ if ( class_exists ( $sControllername ) ) { if ( in_array ( $sAction, get_class_methods ($sControllername ) ) ) { $oController = new $sControllername (); $oController -> $sAction (); return; } } else { echo ('hoi');} } else { /** * Blijkbaar bestaat de controller dus niet, dan is er wat fout gegaan */ echo('De controller bestaat helemaal niet. 404'); //404? } } } ?> |
De comments zijn duidelijk en spreken voor zich lijkt mij. Ook vrij simpel om te zien wat de FrontController al wel (en niet) doet
En hier strand ik meteen. Als ik uitga van de cakephp documentatie wordt er in de controller gezocht naar de juiste model+view. Ik zit te twijvelen; moet dat echt in de controller of kan dat ook al in de FrontController. Immers weet ik nu al dat er een controller aangesproken gaat worden als hij bestaat met een bepaalde actie en ik weet ook dat er een model+view bij hoort. Nu zal mijn denkwijze tot op de grond afgebrand kunnen worden denk ik.
Ik kan héél simpel in de controller kijken hoe de class heet en dan het model+view openen met dezelfde naam als het ware. Maar is dit wel de goede manier? Kortom: Hoe nu verder kwa denkwijze en ontwerpkeuzes.
Dan heb ik ook nog een aantal 'losse' vraagjes die ik niet kon vinden (of wel kon vinden maar ernstig twijvelde aan de waarheid daarvan).
Zo heb ik een class Authenticate. Deze kan bijvoorbeeld zien of er een user is ingelogt, welke rechten erbij horen etc. Nu dacht ik dat dat iets is wat vaak terugkomt en dat je die het beste als 'lib' kan inladen. Aan de andere kant dacht ik als je bijvoorbeeld een forum hebt dat je toch query's hebt die appbased zijn maar waar userrechten zwaar in verwikkeld zijn. In hoeverre moet ik dit apart gaan zien? Is het erg dat er op een bepaald moment een query in het model zit die bijvoorbeeld gelijk op userrechten controlleerd. Vanuit 'gevoel' zou je zeggen dat dat in Authenticate class moet afgehandeld worden maar dan denk ik meteen; eey, je hebt een serieuze ontwerpfout. Bij dit soort dingen is overzicht natuurlijk super belangrijk en het uittekenen van bepaalde zaken. Desalniettemin een ontzettend leerzaam project waar ik ontzettend veel van ga leren en al geleerd heb.
De database class (/lib) wil ik zo klein mogelijk houden. En vooral niet met Singleton werken (lijkt mij ook een ontwerpfout omdat je maar één keer kan initializeren lijkt mij (één instance)). Dus dan wordt het vooral kwa functionaliteit: Querys ophalen, Prepared Statements etc. Die wil ik dan ook zo compact mogelijk houden en ook zo algemeen mogelijk. Dus de corefuncties.
Ik denk dat er véle wegen naar rome zijn maar ik denk ook dat heel veel wegen foutief zijn. Ik denk ook dat een hoop tweakers hier een mening over hebben en ik hoop dan ook dat andere mensen hier ook weer van kunnen leren.
Als disclaimer wil ik wel even zeggen dat dit om een leerprojectje gaat. Denkwijze verbreden etc. Ja ik kan ook gewoon een willekeurig MVC-framework downloaden maar ik kies ervoor om kleinschalig iets zelf te maken om bepaalde dingen te begrijpen. Reacties met 'Download gewoon een framework en concentreer je op de echte problemen' vind ik dan ook niet geheel op zijn plaats. Denk zeg het maar even vooraf