Diskuze: Routování na profi webech
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ak by si sa chcel naučiť ako funguje routing od profíkov tak jednoznačne
odporúčam skúmať kód open source frameworkov ako Laravel, či Lumen. Lumen
je vlastne zjednodušený a menší Laravel... Kód majú veľmi pekne
napísaný
Pred tým ako sa pozrieš na kód prečítaj ich dokumentáciu o routingu https://lumen.laravel.com/…/5.7/routing. Github repozitár Lumenu: https://github.com/laravel/lumen.
Ja ted pouzivam tento jednoduchy routing na jednom webu
### soubor .htaccess ###
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ osob_stranky.php?path=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !/upload$
RewriteCond %{REQUEST_URI} !/download$
RewriteRule ^(.*)$ osob_stranky.php?path=$1/download [L,QSA]
RewriteRule ^(.*)$ osob_stranky.php?path=$1 [L,QSA]
</IfModule>
Problem s detekci soubor a adresar je ten, ze to nehodi vzdy error 404 na
zadanou cestu, proto to ma 3 faze.
Faze1 resi, ze kdyz soubor nebo adresar neexistuje, nech resit presmerovani
php.
Faze2. Pokud soubor existuje a na konci adresy neni ani dovnload ani upload, tak
tam pridej automaticky download a opet to presmeruj na php. V php pak na
download volam specialni script, ktery posila do hlavicky spravne mime/type a
posila data. (cili, nenecha nic resit linux, posilat uzivateli treba php kody.
Vsechno s priponou php si odfiltruji ve svem kodu. Navic, v php kontroluji cestu
a nedovolim mu krast soubory z jineho adresare).
Faze 3 Plati pro vsechno, co ma spravnou adresu, cili na konci je /upload nebo
/download, tak pto posli na me smerovani v php.
Z toho plyne, ze zadny adresar se nesmi jmenovat download ani upload. A take
samozrejme nechci, aby mi pridaval do adresy download, kdyz uz tam jedno je
.../download/download (to je spatne). Proto ve fazi 2 kontroluji, co je na
konci adresy.
Jenze, tento kod je omezeny, neresim zadne parametry stranky. To by se museli
podminky nejak rozsirit. Adresy typu
.../neco.php?a=123 nemam testovane, nepouzivam, pravdepodobne mi je prepise
takto
.../neco.php?a=123/download nebo
.../neco.php/download a nebo
.../neco.php/download?a=123
Nechtelo se mi studovat, jak presne to funguje.
Ale jeste je mozne, ze tam budu delat zmeny, neni to konecna faze. Program zatim
funguje jen castecne. Soubory, stranky zobrazuje, upload take jede. Ale u
nekterych adres s ./ a uvnitr adresy s ./ a ../ mi to nefunguje. Zatim jsem
odlozil zkoumani proc, protoze staci zadat uplnou adresu a je to v cajku. Ale k
tomu se taky dostanu, az poresim jine veci
Spíš než zkoumat kód (jedno řešení), tak by měl zajímal obecný
standardní (nejvíce používaný) princip na kterém to funguje. Je to tak
řešeno na mnoha webech, i na tom to webu (určitě by se k tomu mohl
vyjádřit i autor zdejšího webu). Jde mi o tom, jestli existuje nějaká
obecná architektura nebo princip jak to funguje. A podle toho bych chtěl
zkusit vytvořit své řešení, nebo se o to aspoň pokusit.
Nadřazené články (něco jako kategorie).
id | id_parent | name |
1 | NULL | sport |
2 | 1 | hokej |
3 | 2 | extraliga |
4 | 3 | nazev-clanku |
Při routování pak parsuješ jednotlivé části adresy:
/sport/hokej/extraliga/nazev-clanku
sport
SELECT * FROM article WHERE name = "sport" -> ID 1
hokej
SELECT * FROM article WHERE name = "hokej" AND id_parent = 1 ==> ID 2
extraliga
SELECT * FROM article WHERE name = "extraliga" AND id_parent = 2 ==> ID 3
nazev-clanku
SELECT * FROM article WHERE name = "nazev-clanku" AND id_parent = 3 ==> ID 4
dojel jsi nakonec, vypíšeš článek (případně si zkontroluješ, jestli pod sebou nemá nějaké další, v tom případě by se jednalo o kategorii a vypsal bys vše co má id_parent = 4)
No, ono je to predmetem obchodniho tajemstvi a bezpecnostniho utajovani.
Zkopiruj sem htacces a nekdo tam objevi moznou diru. Totez php nebo jeho popis.
To urcite nechces.
Takze, dotaz, jak to delaji ostatni v tomhle pripade se moc asi nepodeli.
To uz by bylo snadnejsi hledat v pomocne tabulce cely string a vypsat 4 id
naraz
Slozitejsi by to bylo pri prejmenovani kategorie, ze by se to muselo prepsat na
vsech radcich. Ale to neni asi tak dramaticke.
On se neptá na htaccess, on se ptá na routování a zanoření, a vychází z MVC ze zdejších tutoriálů.
Což je to co jsem popsal. Jediný úkol htaccess je přesměrovat všechno na index.php, kde si to přežvýká PHP router (například principem který jsem popsal; samozřejmě, je více možností jak to udělat).
Takže URL rozdělím do pole podle / => budu procházet pole přes
foreach a při každém průchodu se zeptám databáze na ID kde name = hodnota
položky pole a parent id se rovná id z předešlého dotazu? Budu si muset
zkusit napsat nějaký skript, abych to vyzkoušel, jak to funguje
Už se mi povedlo přes cyklus vypsat si id, ale nastala mi další otázka, co když budu mít v url nějaký parametr. Když budu mít rozbitou url v poli dle '/' např. admin/clanky/edit/1 tak budu mít pole $pole = ('admin', 'clanky', 'edit', '1'), tak budu vědět admin - id 1, parent 0; clanky id 2 parent 1, ale pak procházím pole dál a edit neni kategorie a 1 taky ne, takže z tabulky mi to nic nevrátí a url 1 není žádná stránka.
Zobrazeno 10 zpráv z 10.