Routing & MVC
Dagens lektion
-
Apache
- .htacccess-filer
- Använda mod_rewrite i Apache
-
PHP
- Vad är routing?
- Hur gör man?
- Bygg en router!
- MVC-praxis
- Autoloading
- Bygg en router till!
Föreläsningen tillgänglig här:
https://slides.com/marcusdalgren/routing-mvc
.htaccess
- .htaccess är en konfigurationsfil för Apache
- Används för att skriva över inställningar i httpd.conf
- .htaccess gäller i den mapp som filen ligger i och alla undermappar
- Vanligt användningsområde är för mod_rewrite-direktiv
- Funktionaliteten kan stängas av via AllowOverride None
Mod Rewrite
- Apache-modul som används för att dirigera om förfrågningar baserat på olika regler
- En förfrågan som kommer in till en viss url kan antingen dirigeras om eller "skrivas om"
- Omdirigering syns i adressfältet
- Omskrivning är i princip osynligt för besökaren
- Manual: https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html
Exempel
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
# Stäng av multi views
Options -MultiViews
</IfModule>
RewriteEngine On
# Enkel omdirigering
Redirect "/test" "/whatever"
# Dirigera om alla förfrågningar till index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>Vad är routing?
- Routing innebär kortfattat att genom att läsa av url:en bestämma vad/vilken kod i en applikation som skall köras
- Routing är överlag inte filbaserat i den bemärkelsen att en url inte längre motsvarar en fil på din hårddisk
-
Det behövs alltså någon form av kod i ditt projekt som läser av url:en och bestämmer vad som skall göras baserat på det
Hur gör man?
- Aktivera mod_rewrite och styr om alla förfrågningar till index.php
- Bygg en router!
- Profit!
Bygg en router!
- Vi börjar med en "enkel" funktionsbaserad modell
- Skriv en funktion med namnet route som tar två (2) argument
- Första argumentet skall vara url:ens sökväg
- Det andra argumentet skall vara en Callable funktion som exekveras när sökvägen matchar
- route-funktionen skall skriva ut resultatet från er Callable
Tips...
- En av superglobalerna innehåller den information om sökvägen som ni behöver
- Den börjar på $_SE...
- En Callable är en anonym funktion i PHP
- En Callable kan alltså anropas genom tex $minFunktion();
- Vet ni vad anonyma funktioner är för något?
Bygg en router! - fortsättning
- Nu är det dags att centralisera output och avgöra om någon route har matchat eller inte
- Skriv om er route-funktion så att den returnerar om den matchar eller inte och eventuell output
- Samla era routes på lämpligt sätt och gå igenom dem för att avgöra om någon har matchat
- Gör detta i en funktion som heter dispatch
- Beroende på resultatet från dispatch så skall ni antingen skriva ut output från en av era route-funktioner eller skicka en 404-header med lämplig text
MVC-praxis
- Inom MVC så har det etablerats en praxis i hur url:er bör vara strukturerade
- Standard ser ut såhär: /:controller/:action/:argument1/:argument2...
- Där
- :controller är en Controller-klass
- :action är en publik metod på controllern
- :argument1 och :argument2 är argument som skickas till controller-metoden
- Det går alldeles utmärkt att göra avsteg från denna struktur men ha den i åtanke när du gör dina avsteg!
Autoloading
- Nu när vi skall jobba med klasser igen så kan det vara bra att känna till autoloading
- Autoloading är en del av PHP SPL (Standard PHP Library)
- Autoload-funktioner exekveras automatiskt om de finns och en klass inte hittas
- Det är då autoload-funktionens uppgift att försöka hitta rätt klassfil och inkludera den
- Om det går bra så fortsätter applikationen som vanligt
- Autoload-funktioner registreras genom spl_autoload_register
Ni behöver inte skriva en egen!
"autoload": {
"psr-4": {
"Acme\\": "src/Acme"
}
}- Kör sedan composer dump-autoload
- Lägg till require 'vendor/autoload.php'; i eran index.php
- Skriv aldrig require igen!
Bygg en router till!
- Den här gången en klassbaserad router
- Skriv en klass som heter Route
- Kopiera över er route-funktion till Route-klassen och gör den till en privat metod
- Skriv en matchningsmetod för get och en för post
- Respektive metod skall bara matcha om request-metoden är GET eller POST
- Dela upp url:en så att den matchar MVC-praxis
/:controller/:action/:argument1...
Bygg en router till!
- Skriv en publik metod i Route som heter match
- match skall gå igenom alla registrerade routes och returnera den som matchar, om någon
- Skriv en klass som heter Dispatcher dit ni kopierar över er dispatch-funktion och gör den till en publik metod
- dispatch-funktionen skall nu ta emot resultatet från match och avgöra vilken klass och metod som skall anropas och sedan anropa den
Routing & MVC
By marcusdalgren
Routing & MVC
- 321