Bij mijn MVC structuur heb ik een Kernel, waar je een Request object in stuurt en uiteindelijk een Response object uit krijgt om naar de client te zenden.
Na het hele routing proces, is er een Route gematcht, en returnt mijn Router een array met parameters. Deze ziet er zo uit:
array(
'route' => // Route object waarvan het pad matcht met de request URI.
'vars' => // de variabele gegevens uit de url. Het is een associatieve array zoals array('id' => 123). De keys zijn bepaald door het Route object
);
Vervolgens wordt in de kernel (waar ook de router wordt gebruikt om een route te matchen) de gereturnde array met parameters gebruikt.
Het Route object bevat alle informatie over de controller naam, en de action naam.
De controller wordt vervolgens geinstantieerd, en zo gaat alles verder.
Mijn Kernel is gewoon een class. Ik maak ook gebruik van een Container object.
Het Container object wordt geinstantieerd in de constructor van de Kernel class, en wordt vervolgens bewaard als een property in de Kernel.
Het Router object (dat in de kernel wordt gebruikt) wordt ook verkregen uit de Container.
Mijn vragen:
- Op welke manier 'vul' je de (Service)Container met de objecten, zoals de Router, de Mailer, Database, etc.
Wat voor mij belangrijk is, is dat het via pure PHP, maar ook via config bestanden moet kunnen. (de 'container configuratie')
- Op welke manier kan ik flexibel toegang krijgen tot de Container vanuit een controller?
Ik kan natuurlijk (in de kernel) bij het instantieren van de controller de Container meegeven via een controller constructor, maar daardoor moet elke controller verplicht een constructor hebben (en ook nog eens de juiste 'method signature' hebben, dus de juiste parameters accepteren).
- Wat is beter, alles zoals een Mailer object en een Database object in een controller, verkrijgen van een Container, of gewoon een nieuw Database/Mailer object instantieren?
Ik gebruikte in deze vraag even Database en Mailer objecten als voorbeeld van dingen die je wel eens nodig hebt in een controller.