# Een MVC app maken ## Waarom * Leren werken met Model-View-Controller frameworks * Basisprincipes van grote frameworks leren kennen * Opstap naar Laravel, Symphony etc. --- # Een MVC app maken ## Voordelen * Snel veilig applicaties maken * Bedrijven maken vaak gebruik van MVC-frameworks * Gebruik maken van bestaande code van anderen ## Nadelen * Het begin is moeilijk * Het kost veel tijd en oefening --- ## Welke onderwerpen * Single entry point websites * Namespaces * Autoloading * Routing * Middleware * Models * Controllers * Views * API --- ## Single entry point ### Wat is het Bij een single-entry-point gaat het er om dat je van een bepaald domein altijd dezelfde pagina opvraagt ongeacht de parameters in de url. Met behulp van de 'rewrite'-functionaliteit van webservers kun je er voor zorgen dat alle urls wijzen naar dezelfde pagina, het single entry point. --- ## Single entry point Door gebruik te maken van een .htaccess-bestand kun je de Apache webserver de opdracht geven om bij iedere url altijd hetzelfde bestand terug te geven. Meestal wordt hier index.php voor gebruikt. Het .htacces-bestand wordt in de gepubliceerde directory geplaatst en bevat ongeveer de volgende code: ```xml
..... # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
``` --- ## Single entry point Als je de built-in server van php gebruikt van PHP dan kun je bij het opstarten aangeven dat je een single entry point wil gebruiken.... ```shell php -S localhost:8555 public/index.php ``` --- ## Single entry point ### Wat zijn o.a. de voordelen * Security * Alle aanvragen lopen langs hetzelfde bestand, er is dus een betere controle mogelijk * Er is maar 1 bestand dat gepubliceerd wordt door de webserver. * SEO * Je kunt zelf bepalen hoe urls worden opgebouwd, waardoor je vindbaarheid kan optimaliseren --- ## Single entry point ### Hoe werkt het ```php $app->get('/hallo', function(Request $request, Response $response) { $response->append("Dit gaan we op het scherm weergeven"); }); ``` De url https://www.example.com/hallo geeft als resultaat de tekst 'Dit gaan we op het scherm weergeven'. --- ## Composer ### Wat is het Composer is een applicatie die er voor zorgt dat je automatisch klasse-bestanden kunt laden in je applicatie. Als je hele applicatie wordt bestuurd van 1 bestand, dan kun je je voorstellen dat je veel functionaliteit en eigenschappen in klasse-bestanden opslaat. In plaats van het overal 'includen' van bestanden laat je dit over aan composer! --- ## Composer ### Namespaces Composer houdt er ook rekening mee dat je bestanden en klassen van derden gaat gebruiken. De kracht van object-georiƫnteerd programmeren is vooral dat je klassen kunt hergebruiken. Gevaar is wel dat anderen dezelfde namen kunnen gebruiken voor klassen. Met namespaces voorkom je dat klassen elkaar in de weg zitten. Het komt er op neer dat klassen worden bewaard in een map. --- ## Composer ### Namespaces De mapnaam wordt onderdeel van de signatuur van de klasse. De klasse Utilities.php in de map JJ geeft de signatuur JJ/Utilities. De klasse Utilities ziet er zo uit: ```php namespace JJ/Utilities; class Utilities { ....... } ``` --- ## Composer ### Namespaces Om gebruik te maken van de klasse Utilities in een ander bestand moet je onderstaande code gebruiken: ```php //index.php use JJ\Utilties; .... ``` --- ## Routing ### Wat is het Een router is een klasse die functionaliteit en eigenschappen heeft om aanvragen vanuit een url af te handelen op basis van regels. In dit voorbeeld..... ```php $app->get('/hallo', function(Request $request, Response $response) { $response->append("Dit gaan we op het scherm weergeven"); }); ``` De return-waarde van
$app->get()
is een router-object (ook wel een 'route' genoemd). --- ## Middleware ### Wat is het Middleware is code die je wilt laten uitvoeren voor- of nadat de 'route' zijn output heeft gegenereerd. Een voorbeeld is authenticatie. Je wilt controleren of de gebruiker wel de juiste rechten heeft om een 'route' uit te laten voeren. --- ## Middleware Door de functie
add()
aan te roepen vanuit het router-object kan de functie
$mw
worden uitgevoerd. De tekst 'In router - Dit wordt na de route toegevoed' wordt weergegeven ```php $mw = function(Request $request, Response $response) { $response->append(" - Dit wordt na de route toegevoegd"); return $response; }; $app->get('/hallo', function(Request $request, Response $response) { $response->append("In router"); })->add($mw); ``` --- ## Middleware Iets verder uitgewerkt voor meer duidelijkheid.... ```php $mw = function(Request $request, Response $response) { $response->append(" - Dit wordt na de route toegevoegd"); return $response; }; $routerObject = $app->get('/hallo', function(Request $request, Response $response) { $response->append("In router"); }) $routerObject->add($mw); ```