Hallo,

In mijn MVC maakte in eerst geen gebruik van een Response object, maar wel van een Request object. Ik ben dus nu een Response object aan het inbouwen. Maar waar doe ik dat eigenlijk?

Het zit zo in elkaar:
index.php
Doet de routing. Hier wordt een router object gemaakt etc. De router krijgt een Request object. De router include de controller die bij de route hoort en de actie van de controller wordt uitgevoerd. Aan de actie wordt het Request object meegegeven als parameter.

In controller
Worden model objecten gemaakt.
Bij mij hebben models nooit een verband met views of controllers.
De controller vraagt met methods aan een model on gegevens, of geeft aan het model een opdracht om gegevens aan te passen.
Wel geef ik bijna altijd een Database object mee aan een model object via de constructor.

De controller include daarna een view bestand, en een array met variabelen voor de view wordt ge-extract.
Bij het includen van de view is eigenlijk alles uitgevoerd, dus wordt er vanzelf een response gegeven, omdat PHP gewoon klaar is (callstack is klaar, of hoe noem je dat?) doordat het view bestand is ge-include wordt dus ook dat bestand weergeven.

Waar doe ik een Response object inbouwen, en wat moet dat object eigenlijk doen?
<?php
// of een template renderen en die als body meegeven
return new Response($this->templating->render('static/hello.html.twig'));
?>

Even een stukje van Wouter zijn voorbeeld gepakt.

Hier wordt Twig gebruikt om een pagina te genereren.

Een heel erg simpel voorbeeldje van een Twig template:

// views/customer/show.html.twig

<html>
    <head>
	<title>blabla</title>
    </head>
    <body>
        
        <h1>Klantgegevens</h1>

        <table>
            <tr>		
                <th>naam:</th>
                <td>{{ customer.name }}</td>
            </tr>		
            <tr>		
                <th>email:</th>
                <td>{{ customer.email }}</td>
            </tr>		
        </table>
            
    </body>
</html>


Let dan vooral op de variabelen: {{ customer.name }} en {{ customer.email }}

Twig doet dus geen include maar een file_get_contents() !!!!
Ik hoop dat je het verschil weet hiertussen? anders gaan we daar dieper op in.

Twig vervangt de variabelen voor de daadwerkelijke naam en mailadres van de klant in dit voorbeeld.


Je hebt de controller, een response object (een storage met "het antwoord aan de client") en een class die dat antwoord in elkaar moet sleutelen. Hiervoor kunnen zoals Wouter al aangaf verschillende classes ingezet worden.
Zo heb je behalve een HTML response ook een JSON response, een Image response of een PDF response (etc)
Los van een templating engine; als je zelf je eigen reponse object zou willen bouwen is het handig om die flexibel te laten, bijvoorbeeld door DOMDocument een document te laten bouwen dat je aanvult op plekken die je via XPath queries aangeeft, om vervolgens de output terug te sturen naar de browser. En dan maakt het niet uit of dat weer via tekst/html, of een XML-letje / JSON-netje voor je XHR-object gaat.
Waarbij ik niet zeg dat het niet loont om af te kijken hoe andere frameworks dat doen.
Dus Frank,
Dit stukje code

<?php
        // of een template renderen en die als body meegeven
        return new Response($this->templating->render('static/hello.html.twig'));
?>

Daar krijgt het response object de uiteindelijke output meegegeven in zijn constructor.
$this->templating->render('static/hello.html.twig') dat zorgt ervoor dat de inhoud van een template wordt opgehaald, met bijvoorbeeld file_get_contents(), en dat de inhoud van dat bestand wordt gelezen door een templating engine. Die templating engine vervangt dan bepaalde patterns zoals {{ customer.name }} door gegevens die hij ook op een of andere manier weet en dus kan invullen?

Reageren