Sådan bygger du et grundlæggende routersystem på serversiden i PHP.

Taget af Aaron Sekisambu

I forbindelse med en web-applikation på serversiden er et routing-system den del af web-applikationen, der kortlægger en HTTP-anmodning til en anmodningshåndterer (funktion / metode). En HTTP-anmodning består af en header og eventuelt et organ. Headeren indeholder oplysninger om anmodningen, f.eks. Metode, sti og vært. Nogle metoder som GET, HEAD og OPTIONS gør ikke brug af anmodningsorganet, mens andre som POST, PUT og PATCH bruger det til at videregive data fra en klient til en server.

Brug af et routingsystem giver os mulighed for at strukturere vores applikation på en bedre måde i stedet for at udpege hver anmodning til en fil.

Et routingsystem fungerer ved at kortlægge en HTTP-anmodning til en anmodningshåndterer baseret på anmodningsmetoden og stien, der er angivet i anmodningens URL. Dette er nøjagtigt, hvad vi skal bygge i denne tutorial.

Krav.

  • Du har brug for PHP version 5 eller nyere for at køre på din udviklingsmaskine.
  • Grundlæggende PHP-viden inklusive fortrolighed med PHP-globale variabler
  • En forståelse af objektorienteret PHP.

Ansvarsfraskrivelse.

  • Denne router håndterer kun GET- og POST-anmodninger.
  • Jeg vil ikke bruge smarte værktøjer og biblioteker. Ingen komponist, ingen autoloading. Jeg vil holde fokus på konceptet.
  • Enhedstestning er stor, men jeg vil ikke gøre det med det formål at holde denne tutorial kort. (Undskyld gode udviklere)
  • Koden, jeg skal skrive, er ikke produktionskodekode.

Lad os begynde.

Opret en mappe til projektet ved hjælp af terminalen og cd ind i mappen.

$ mkdir php-router
$ cd php-router

Opret 4 filer i mappen som vist nedenfor.

$ touch index.php Request.php IRequest.php Router.php

index.php - Dette er indgangsfilen til webapplikationen. Det er her vi initialiserer routeren og definerer vores ruter. Den skal også indeholde al import.

Request.php - Denne fil vil indeholde en klasse for Request-klassen til initialisering af objekter, der indeholder oplysninger om HTTP-anmodningen.

IRequest.php - Denne fil vil indeholde det interface, som Request-klassen skal implementere.

Router.php - Denne fil vil indeholde router-klassen.

Inden vi skriver routeren, er vi nødt til at designe dets API (Sådan bruges det i apps). Nedenfor er API til out router.

$ router = ny router;
// Hvordan GET-anmodninger defineres
$ router-> get ('/ some / route', funktion ($ anmodning) {
    // Argumentet om $ anmodning om tilbagekald
    // vil indeholde oplysninger om anmodningen
    returner "Indhold";
});
// Hvordan POST-anmodninger defineres
$ router-> post ('/ nogle / rute', funktion ($ anmodning) {
    // Hvordan man henter data fra anmodningsorganet
    $ body = $ request-> getBody ();
});

Nu hvor vi har defineret, hvordan vores router skal bruges, lad os oprette den.

Opret klassen Anmodning.

Først skal du definere det interface, som den konkrete anmodningsklasse skal implementere. I IRequest.php definerer IRequest-grænsefladen.

getBody () henter data fra anmodningsorganet. Anmodningsklassen skal have implementeringen af ​​denne metode.

Opret klassen Anmodning.

I konstruktøren påkaldes bootstrapSelf () - en metode, der indstiller alle nøgler i den globale $ _SERVER-array som egenskaber i klassen Request og tildeler også deres værdier. Denne metode ringer til metoden toCamelCase ().

Metoden toCamelCase () konverterer en streng fra slangekasse til kamelkasse.

getBody () er en implementering af metoden defineret i IRequest-grænsefladen.

Opret router-klassen.

I Router.php skal du tilføje følgende kode til routeren.

I routerklassens konstruktør skal du holde en henvisning til dets afhængighed - Request-objektet.

Lad os bruge PHP-magi-metoden __call (). Denne metode udløses, når der påberåbes utilgængelige metoder i en objektsammenhæng.

Overvej kodeprøven nedenfor.

Vi prøver at påkalde metoden get (), som ikke er defineret i klasse Router, så __call () magi-metoden udløses. Det modtager to argumenter. Det første argument er metodenavnet ('get'), og det andet er en række argumenter, som get () -metoden blev påberåbt med i.e ['/', funktion () {}].

Vi bruger __call () magi-metoden til dynamisk at oprette en tilknyttet matrix, der kortlægger ruter til tilbagekald. Vi opretter en til hver understøttet anmodningsmetode. Hvis der kaldes en ugyldig metode til routerobjektet, svarer vi med en 405-metode ikke tilladt.

Metoden resolut () vælger en tilbagekald, der bliver kaldt til at håndtere en anmodning baseret på anmodningens HTTP-metode og sti (‘/’, ‘/ foo / bar’ osv.).

Nu hvor vi har vores router, så lad os bruge den til at oprette en app.

Opret en app.

I index.php skal du importere de anmodning- og routerklasser, vi har defineret, initialisere en router og definere nogle ruter.

Kør og test manuelt appen.

Lad os bruge PHPs udviklingsserver til at køre appen på port 8000.

Mens du er i terminalen, skal du cd ind i projektmappen og køre følgende kommando.

$ php -S 127.0.0.1:8000

Åbn din webbrowser, og gå til http: // localhost: 8000 / og http: // localhost: 8000 / profile for at teste hjemmeside og profilsider.

Brug postbud eller krøller (eller ethvert andet værktøj efter eget valg) til at teste POST-ruten til http: // localhost: 8000 / profile.

Her er et skærmbillede af min test ved hjælp af postbud.

POST / data fungererSLET / data returnerer 405 Metode er ikke tilladt

Endelige tanker.

PHP har i øjeblikket dårlig støtte til HTTP-metoder, der tillader at sende data i anmodningsorganet, bortset fra POST (dvs. PUT, DELETE, PATCH, osv.).

Du skal bruge php: // input (en read-only input stream) til at læse rå data fra anmodningskroppen og derefter parse dataene i et nøgleværdipar.

Har du brug for at ansætte topudviklere? Tal med Andela for at hjælpe dig med det.