Klassen laden met include of namespace en autoloader?
Mijn routing systeem is nu als volgt opgebouwd, en ben best tevreden.
Op index.php wordt een Request object aangemaakt.
De routes die ik definieer zijn een Route object, die ik in een RouteCollection object zet.
Er wordt dan een Router object gemaakt, en die krijgt weer een RouteMatcher object (soort dependency injection), en krijgt de routecollection. (die routecollection wordt doorgegeven aan zijn RouteMatcher)
Het routerobject krijgt dan op index.php de method call match() met als parameter het Request object.
Dat object geeft de Router weer door aan zijn RouteMatcher. De routematcher kan de route van het request object vragen met een methode die GET variabelen retourneert. bijvoorbeeld: $request->getQuery("route");
In mijn route geef ik het "pad" aan (de route eigenlijk), de controller en de action (de methode die op de de controller wordt uitgevoerd).
Voorbeeld:
Ik maak ook al gebruik van een autoloader, die de plek van de klassen vindt door hun namespace. De namespaces horen dus bij de mapstructuur.
Nu is mijn vraag:
De routeMatcher in de router doet de routes zoeken in de collection en de controller en action uitvoeren. Die controller doe ik nu laden met een namespace, die standaard begint met "/controllers/" en daarachter plak ik de classnaam.
Dus bij het laden van een controller: $c = new controllers\Contact
Kan ik het niet beter gewoon includen, aangezien het eigenlijk sowieso wordt geinclude door de autoloader?
Gewijzigd op 17/06/2014 20:42:36 door Jan terhuijzen
Feitelijk doe je het naar mijn idee juist. Die autoloader hebben we nu eenmaal uitgevonden om niet meer 'handmatig' te hoeven includen. Daarbij moet je jezelf afvragen wat de verantwoordelijkheid is van jouw RouteMatcher. Ik denk dat het antwoord moet zijn: het vinden van de juiste controller bij een bepaalde route. Dat doet ie dus. En deze class mag maar één verantwoordelijkheid hebben en geen twee. Hij moet dus niet ook nog eens de verantwoording krijgen om een bestand op de juiste wijze te includen.
Frank Nietbelangrijk op 17/06/2014 20:50:52:
En deze class mag maar één verantwoordelijkheid hebben en geen twee. Hij moet dus niet ook nog eens de verantwoording krijgen om een bestand op de juiste wijze te includen.
Precies. Anders krijg je dat je bij een verandering in je mappenstructuur opeens en je autoloaders en je routeMatcher moet gaan aanpassen. Dat is een no-no in OOP land.
Gewijzigd op 17/06/2014 21:27:28 door Erwin H
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
// $r is het gematchte Route object.
$c = "\\controllers\\" . $r->getControllerName();
$controller = new $c($request);
$controller->{$r->getActionName()}();
// $request is nog het Request object dat de RouteMatcher
// had gekregen.
// Dat Request object geef ik weer door aan de
// controller via de constructor
$c = "\\controllers\\" . $r->getControllerName();
$controller = new $c($request);
$controller->{$r->getActionName()}();
// $request is nog het Request object dat de RouteMatcher
// had gekregen.
// Dat Request object geef ik weer door aan de
// controller via de constructor
Ik maak nu eerst de string $c, die ik gebruik achter het keyword new.
Ik heb hier wat mee zitten te proberen, maar het lukt me niet om de twee regels 2 en 3 in één stap te doen, zonder variabele $c. Kan dit eigenlijk wel in 1 keer?
En verder zou ik graag willen controleren of een methode wel bestaat in de controller. Op regel 3 roep ik gewoon een methode aan die misschien niet eens bestaat. Moet ik is_callable() of method_exists() gebruiken?
Toevoeging op 17/06/2014 22:39:07:
Erwin H op 17/06/2014 21:26:55:
Precies. Anders krijg je dat je bij een verandering in je mappenstructuur opeens en je autoloaders en je routeMatcher moet gaan aanpassen. Dat is een no-no in OOP land.
Maar als je mappenstructuur verandert, en je gebruikt de namespaces om de autoloader te laten weten waar iets te vinden is, dan moet je wel even de namespaces boven aan elk klasse bestand dus mee aanpassen met de mappenstructuur?
Gewijzigd op 18/06/2014 14:44:03 door jan terhuijzen
Oké... even zwaar off-topic, maar toch heel goed bedoeld.
Dit is geen aanval, maar je praat op een nogal "bijzondere" manier. Je gebruikt regelmatig het woord "doet". Dat is niet echt een gebruikelijke manier van praten, en het komt een beetje... uhm, eh.. hoe zeg ik dat nu tactisch... naja... het komt een beetje vreemd/ongebruikelijk over. Je praat eigenlijk op een manier zoals sommige mensen praten waarvan Nederlands niet de moedertaal is. Wellicht is dat bij jou ook het geval?
Even de voorbeeldjes:
- De routeMatcher in de router doet de routes zoeken...
- Die controller doe ik nu laden...
- Ik doe dus eerst een variabele $c maken...
- Op regel 3 doe ik nu gewoon een methode aanroepen...
Goed, hoe kunnen we hier nu normale zinnen van maken? Heel eenvoudig. We gebruiken niet meer DOE + WERKWOORD, maar enkel nog het WERKWOORD in de juiste vorm. Dan krijgen we:
- De routeMatcher in de router
- Die controller
- Ik
- Op regel 3
Nogmaals, dit is goed bedoeld. Het is een heel makkelijke manier om je taalgebruik te verbeteren en ik hoop dan ook dat je er je voordeel mee kunt doen.
Ik wil vragen om weer on-topic te gaan. Grammaticale leerpunten kunnen wel in het vervolg wel buiten dit topic om worden uitgelegd. Via een vriendelijke PM bijvoorbeeld of als het echt nodig is via een moderatie-melding.
Gewijzigd op 18/06/2014 01:08:40 door - Ariën -
Jan terhuijzen op 17/06/2014 21:33:28:
Maar als je mappenstructuur verandert, en je gebruikt de namespaces om de autoloader te laten weten waar iets te vinden is, dan moet je wel even de namespaces dus mee aanpassen met de mappenstructuur? (De namespaces boven aan elk klasse bestand)
Dat klopt, daar ontkom je niet aan inderdaad.
Excuses voor mijn slechte taalgebruik, ik heb mijn bericht wat aangepast. Ik schaam me een beetje, terwijl ik gewoon 100% Nederlands ben.
Je hoeft je echt niet te schamen hoor! Sommige gewoontes die sluipen er haast onmerkbaar in. Nu ben je je er in ieder geval bewust van en kun je er wat aan doen ;)