Tzv. "hezké URL" jsou fenoménem poslední doby. Hlavně ve spojení se a díky popularizaci SEO (Search Engine Optimization). Pojďme se podívat, jak lze v PHP jednoduše takovéto URL zpracovat!
Jednoduchý routing v PHP
Tak jsem si jednou zase řekl, že se porozhlédnu po PHP frameworcích – jestli se něco nezměnilo, jestli nemá cenu něco z toho, co tu máme, začít používat atp. A narazil jsem na jednu věc, jejíž řešení se mi moc nelíbilo, resp. se mi zdálo a zdá zbytečně složitě dělané a nepružné. Z nadpisu je určitě poznat, o co se jedná – ano, routing, routování atp.
Např. takový Zend na to hned vytahuje celou mašinerii objektů nejrůznějšího druhu, pro každý druh cesty má svou svou vlastní třídu apod. Někdo by mohl říct, že je to tak správně – je tu mnoho voleb, co zvolit pro jaký případ routy apod. Ale já, jak jinak, si to nemyslím. PHP je už tak pomalé a zatěžovat ho při každém požadavku prací, myslím že i navíc, jen abychom mohli spustit funkční kód, je podle mě napováženou.
Nebyl bych to já, kdybych hned nepřišel s něčím „lepším“ :o) A v čem je celý ten fígl? Použití pár regulárních výrazů, při čemž se využijí všechny jejich možnosti. Na POSIXové regulární výrazy tedy rovnou zapomeňte (funkce jako ereg(), ereg_replace() nechme dětem), protože k tomuhle budou potřeba Perl-compatibile výrazy, které nabízejí mnohem širší možnosti. K seznámení doporučuji seriál o PCRE na intervalu.
Tak ale vrhněme se již na to. Routy jsou většinou zapisovány jako sekvence znaků, kde některé sekvence mohou mít speciální význam. Např. takové :nazev značí, že tady bude nějaká proměnná část. Hvězdička může sloužit k tomu, aby řekla, že tady může být cokoli. Prvního se budeme držet i my. Hvězdičku jsem v životě nevyužil, takže to vynechám, ale „doimplementace“ by byla jednoduchá. Přidáme však ještě jedno rozšíření, které jsem našel u Háefka a je mi velice sympatické. A to syntaxe :nazev{[a-z]+}, kde se ve složených závorkách za „proměnnou“ může udat regulární výraz, místo toho, aby bylo pole s mapováním regulárních výrazů a názvů někde vedle. Jen bych ji pro jednoduchost implementace trochu pozměnil – místo složených závorek použil třebas špičaté (< a >). Hlavním důvodem je to, že špičaté nejsou žádným řídícím znakem v regulárních výrazech (no, dobře v konstrukcích (?!) se vyskytují :o)), zato složené se používají pro určení počtu opakování (jehož použití bude nejspíš častější než ta tvrzení o předchozím), a taky se v URL moc nevyskytují, takže se ani moc nebudou vyskytovat v routách, a tedy budou opravdu sloužit k označené regulárních výrazu za proměnnou. Takže nová verze je :nazev. A nějaká komplexnější routa by mohla vypadat následovně:
Zdroj: Bukaj.netuje.cz