Geen overdracht argumenten naar controller
https://medium.com/@noufel.gouirhate/create-your-own-mvc-framework-in-php-af7bd1f0ca19
Dit ervaar ik als een goed artikel dat mijn inzicht weer een stukje verder brengt. Aldus besluit ik het bijbehorende project te downloaden en aan een nader onderzoek te onderwerpen. Ik vind de link hier:
https://github.com/ngrt/MVC_todo
Tot zover gaat alles goed. Maar als de dispatcher de betreffende controller moet starten en argumenten overdragen loop ik vast, graag een zetje in de goede richting?
De gebruikte url is:
Router url: /mvc/dog/bark/hiaaah
In de dispatcher gaat het om deze code:
$controller = $this->loadController();
echo '<p>Dispatcher-controller: </p>';
echo '<pre>';
echo print_r($controller);
echo '</pre>';
Output:
Dispatcher-controller:
dogController Object
(
[vars] => Array
(
)
[layout] => default
)
1
echo '<p>Dispatcher-request-action: '.$this->request->action.'</p>';
Output:
Dispatcher-request-action: bark
echo '<p>Dispatcher-request-params: </p>';
echo '<pre>';
echo print_r($this->request->params); // This is already an array()!
echo '</pre>';
Output:
Dispatcher-request-params:
Array
(
[0] => hiaaah
)
1
Conclusie: ik heb alle parameters voor overdracht naar de controller op orde.
Dan nu dit statement:
call_user_func_array([$controller, $this->request->action], $this->request->params);
Tot zover de code in de dispatcher.
In de controller heb ik de volgende code:
Class dogController extends Controller
{
function dog($bark, $sound)
{
echo '<p>Class dogController method: '.__METHOD__. "() hond: $bark en huilt: $sound </p>”;
}
} // Class dogController
Maar deze output krijg ik niet. Voorlopige conclusie; het statement in de dispatcher:
call_user_func_array([$controller, $this->request->action], $this->request->params);
lijkt niet te werken.
Wat doe ik hier fout?
En het manual vermeldt nogal expliciet: de functie 'call_user_func_array()' gaat niet werken als er in de voorgaande code een fout is opgetreden.
Dan een bezoek aan de log file; en daar staat dat m'n class dogController geen functie bark() heeft; dát is dus m'n fout!
Dit had ik ook eerder kunnen zien - en dat zou me heel veel zoekwerk hebben bespaard - als ik de error reporting zou hebben aangezet.
Laat het een les zijn; niet alleen voor mij.
dan word ik eigenlijk al een beetje mistroostig.
Hier vervuil je namelijk onnodig de "querystring namespace". De code maakt al gebruik van REQUEST_URI, dus waarom heb je dan nog ?p=whatever nodig?
En wat als je straks een pagineringssysteem hebt met ?p=1, ?p=2 etc? De querystring parameter "p" wordt hier onnodig gereserveerd/geclaimd. Dit is ook niet echt in de geest van de querystring, deze zou namelijk transparant moeten zijn. Het querystring-gedeelte van URLs wijkt in deze opzet af van $_GET omdat je onder water "p" injecteert...
Ook qua naamgeving biedt dit weinig flexibiliteit, het zal altijd van de vorm <controller>/<action>[/<parameter(s)>] zijn. Dit hoeft trouwens niet per se een probleem te zijn.
Overal requires, er is geen autoloader?
Een connectie (met hardcoded parameters, waarom trek je deze niet uit het config object of uit een config file?) zonder indicatie van character encoding en je connect met root... Ayyy.
Okay, voor de illustratie van een MVC-aanpak is dit misschien afdoende, maar andere principes worden hier met voeten getreden :/.
Als illustratie, zeker!
Er zit nog veel meer in dat project dat ik op die manier niet zou willen maken. Maar om het principe aan de hand van een uitgewerkt voorbeeld te doorgronden, voor mij voldoende.