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?

  1. Aktivera mod_rewrite och styr om alla förfrågningar till index.php
  2. Bygg en router!
  3. 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!

  • Composer innehåller en standard-implementation som följer PSR-4
  • Kör composer init
  • Lägg sedan till autoload i composer.json
"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