Kuidas luua PHP-s põhiline serveripoolne marsruutimissüsteem?

Pildistanud Aaron Sekisambu

Serveripoolse veebirakenduse kontekstis on marsruutimissüsteem veebirakenduse osa, mis kaardistab HTTP päringu päringu töötlejale (funktsioon / meetod). HTTP-päring koosneb päisest ja soovi korral kehast. Päis sisaldab teavet päringu kohta, näiteks meetod, tee ja host. Mõned meetodid, nagu GET, HEAD ja OPTIONS, ei kasuta päringu sisu, teised, näiteks POST, PUT ja PATCH, kasutavad seda kliendi kaudu serverisse andmete edastamiseks.

Marsruutimissüsteemi kasutamine võimaldab meil oma rakendust paremini struktureerida, selle asemel et iga taotlust failile määrata.

Marsruutimissüsteem toimib kaardistades päringu töötlejale HTTP-päringu, tuginedes päringu URL-is täpsustatud päringumeetodile ja -teele. See on täpselt see, mida me selles õpetuses üles ehitame.

Nõuded.

  • Teie arendusmasinas peate käitama PHP versiooni 5 või uuemat.
  • PHP põhiteadmised, sealhulgas tundmine PHP globaalsete muutujatega.
  • Objektorienteeritud PHP mõistmine.

Kohustustest loobumine.

  • See ruuter töötleb ainult GET- ja POST-taotlusi.
  • Ma ei kavatse kasutada väljamõeldud tööriistu ja raamatukogusid. Pole heliloojat ega autoloadingut. Tahan keskenduda kontseptsioonile.
  • Ühiku testimine on suurepärane, kuid ma ei kavatse seda teha, pidades seda õpetust lühikeseks. (Vabandame heade arendajate pärast)
  • Kood, mille kirjutama hakkan, ei ole tootmisvalmis kood.

Alustagem.

Terminaali abil looge projekti jaoks kaust ja sisestage see kausta.

$ mkdir php-ruuter
$ cd php-ruuter

Looge kausta 4 faili, nagu allpool näidatud.

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

index.php - see on veebirakenduse sisendfail. Selles kohas lähtestame ruuteri ja määratleme oma marsruudid. See sisaldab ka kogu importi.

Request.php - see fail sisaldab klassi Request klassi objektide lähtestamiseks, mis sisaldavad teavet HTTP-päringu kohta.

IRequest.php - see fail sisaldab liidest, mida Request klass peab rakendama.

Router.php - see fail sisaldab ruuteri klassi.

Enne ruuteri kirjutamist peame kujundama selle API (kuidas seda rakendustes kasutatakse). Allpool on väljas ruuteri API.

$ ruuter = uus ruuter;
// Kuidas määratletakse GET-taotlused
$ ruuter-> saada ('/ mõned / marsruut', funktsioon ($ päring) {
    // Tagasihelistamise $ request argument
    // sisaldab teavet päringu kohta
    tagastama "Sisu";
});
// Kuidas POST-taotlusi määratletakse
$ ruuter-> postitus ('/ mõned / marsruut', funktsioon ($ päring) {
    // Kuidas saada andmeid päringuid teostavalt asutuselt
    $ body = $ päring-> getBody ();
});

Nüüd, kui oleme määratlenud, kuidas meie ruuterit kasutatakse, loogem see.

Looge taotlusklass.

Esiteks määrake liides, mida konkreetne taotlusklass rakendab. IRequest.php-is määratlege IRequesti liides.

getBody () hangib päringu kehalt andmeid. Taotlusklassil peab olema selle meetodi rakendus.

Looge taotlusklass.

Käivitage konstruktoris bootstrapSelf () - meetod, mis seab kõik võtmed globaalses massiivis $ _SERVER massi klassi Request atribuutidena ja määrab ka nende väärtused. See meetod kutsub esile meetodi toCamelCase ().

ToCamelCase () meetod teisendab stringi madu ümbrisest kaamelikarbiks.

getBody () on IRequesti liideses määratletud meetodi rakendamine.

Looge ruuteri klass.

Lisage ruut Router.php järgmine ruuteri kood.

Hoidke ruuteri klassi konstruktoris viide selle sõltuvusele - objekt Taotle.

Kasutagem PHP võlumeetodit __call (). See meetod käivitatakse juurdepääsematutele meetoditele kutsumisel objekti kontekstis.

Mõelge allpool toodud koodinäidisele.

Proovime kutsuda meetodit get (), mida klassi ruuteris pole määratletud, seega käivitatakse maagiline meetod __call (). Sellel on kaks argumenti. Esimene argument on meetodi nimi ('saada') ja teine ​​argumentide kogum, et meetodit get () kutsuti esile koos i.e ['/', function () {}].

Kasutame maagilist meetodit __call (), et dünaamiliselt luua assotsiatiivne massiiv, mis kaardistab marsruudid tagasihelistamisele. Loome iga toetatud päringu meetodi jaoks ühe. Kui ruuteriobjektile kutsutakse kehtetu meetod, vastame meetodiga 405 Pole lubatud.

Meetodi lahendamise () abil valitakse tagasihelistamine, mis kutsutakse päringu menetlemiseks, lähtudes päringu HTTP-meetodist ja -teest ('/', '/ foo / bar' jne).

Nüüd, kui meil on ruuter, kasutagem seda rakenduse loomiseks.

Looge rakendus.

Importige kataloogis index.php meie määratletud klassid Request ja Router, lähtestage ruuter ja määrake mõned marsruudid.

Käivitage rakendus ja testige seda käsitsi.

Kasutame rakenduse pordi 8000 käivitamiseks PHP arendusserverit.

Terminalis olles sisestage CD projekti kausta ja käivitage järgmine käsk.

$ php -S 127.0.0.1:8000

Ava- ja profiililehtede testimiseks avage oma veebibrauser ja liikuge aadressidele http: // localhost: 8000 / ja http: // localhost: 8000 / profile.

Kasutage Postmani või lokke (või mõnda muud teie valitud tööriista), et testida POST-i marsruuti aadressile http: // localhost: 8000 / profile.

Siin on ekraanipilt minu testist, mis kasutab postimeest.

POST / andmed toimivadKustutamine / andmete tagastamine 405 Meetod pole lubatud

Lõplikud mõtted.

PHP-l on praegu halb tugi HTTP-meetoditele, mis võimaldavad saata päringu kehas muid andmeid kui POST (st PUT, DELETE, PATCH jne).

Töötlemata andmete lugemiseks päringu kehast peate kasutama php: // sisendit (kirjutuskaitstud sisestusvoogu) ja seejärel sõeluma andmed võtme-väärtuse paaridesse.

Kas peate palkama tipparendajaid? Rääkige sellest Andelaga.