Przy realizacji większych projektów w PHP prędzej czy później pojawi się potrzeba uporządkowania kodu a szczególnie samych plików ze skryptami. Zdecydowana większość programistów PHP w pewnym momencie zaczyna pisać aplikacje z wykorzystaniem frameworków a ten krok już na pewno czeka wszystkich tych co rozwijają i utrzymują backend w zespole. Te frameworki problem routingu i parsowania adresu URL mają, że tak powiem „w standardzie” i tutaj problem w jakiś sposób jest już rozwiązany. Frameworków dla PHP jest od groma a najpopularniejsze z nich to: Laravel, Symfony, CodeIgniter, Zend.

Stosowanie (jakichkolwiek) frameworków zawsze ma swoje plusy i minusy (o tym będzie osobny wpis) a pisanie aplikacji jest oparte o pewnego rodzaju filozofię (a już na pewno o paradygmat OOP) i architekturę, które są zaproponowane i zaprojektowane z góry przez samych twórców konkretnego frameworka. Z tego powodu mniejsza część programistów decyduje się pisać aplikacje od podstaw „na swoim frameworku” co też oczywiście ma swoje wady i zalety.

Korzyści z pisania aplikacji od podstaw przeważają w przypadku rozwijania aplikacji przez jedną osobę lub małą grupę znających się programistów, a jednym z przedstawicieli tej grupy (jak już mona się domyślić) jestem także ja 😉 Zdecydowanie, z frameworków raczej nie będą korzystać Ci, co samo programowanie orientowane obiektowo (OOP) uważają za jedną wielką pomyłkę.

Tymi zaletami jest elastyczność, szybkość, prostota kodu oraz brak konieczności stosowania jakichkolwiek konwencji które „ktoś” wymyślił co zmniejsza koszt produkcji software’u praktycznie na każdym kroku. Kod pisany na autorskim frameworku trudniej jest edytować przez kogoś „z zewnątrz” a napisana aplikacja jest trudniejsza do zhakowania – z wyjątkiem sytuacji gdzie autorem aplikacji jest osoba niedoświadczona.

Czym jest parsowanie adresu URL?

Parsowanie adresu URL to nic innego jak zamiana adresu z przeglądarki, który jakby nie było jest tylko ciągiem znaków na logiczną dla aplikacji ścieżkę prowadzącą do konkretnego skryptu lub nawet konkretnej funkcji aplikacji.

parsowanie adresu url

Jak widać na powyższej ilustracji, chcemy wywołać część aplikacji odpowiedzialnej za funkcję „wystaw przedmiot”.

Wywoływanie konkretnej funkcji z adresu URL

Aby to zrealizować musimy przekierować zapytania http/https do konkretnego pliku, który będzie trzymał logikę tych zapytań i trasował tego typu zapytania.

Krok 1: .htaccess – załóżmy że chcemy przekierować wszystkie tego typu zapytania do pliku index.php. Oczywiście, że użyjemy pliku konfiguracyjnego .htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

Oczywiście, należy wykluczyć z takiego routingu wszystkie adresy url, które będą prowadzić do zasobów (takich jak: pliki css, js, obrazy, zdjęcia, pliki pdf, fonty itd…) a nie do poszczególnych funkcji w aplikacji. Aby to zrealizować użyjemy RewriteCond:

RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png|eot|ttf|woff|woff2)$ [NC]   

Prawie gotowe. Aby parsowanie adresu URL było wygodniejsze i uniknąć związku z tym niepotrzebnych komplikacji doradzam już na tym etapie zatroszczyć się kwestiami SEO i zdecydować czy adresy mają mieć na końcu slash czy nie. Załóżmy, że zależy nam na dodaniu slasha, dlatego wykonujemy odpowiednie przekierowanie:

RewriteCond %{REQUEST_URI} (/$|\.) 
RewriteRule (.*) %{REQUEST_URI} [R=301,L]

Jeżeli nie chcemy znaku slasha na końcu, zrezygnujmy z tego kroku, ponieważ odpowiednie przekierowania wykonamy w logice aplikacji.

Cały nasz .htaccess powinien wyglądać tak:

RewriteEngine on
RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png|eot|ttf|woff|woff2)$ [NC]   
RewriteRule .* index.php 

Krok 2: parsowanie adresu URL

W pliku index.php trzeba teraz „wyciągnąć” url aby na jego podstawie uruchamiać poszczególne partie aplikacji. Oczywiście bardzo łatwo to wykonać za pomocą standardowych instrukcji PHP. Pomysł jest taki aby za pomocą funkcji explode stworzyć tablicę która w uporządkowany sposób będzie przechowywać ścieżkę:

$url = explode('/', $_SERVER['REQUEST_URI']);
$url = array_filter($url);

Krok 3a: przekierowanie do konkretnego pliku php:

if($url[0] == "kontakt"){
 require("template/kontakt.php");
}

Tutaj można skorzystać z funkcji case lub od razu wywoływać poszczególne pliki, jednak lepiej jest mieć wszystko pod kontrolą aby w odpowiedni sposób obsłużyć nieprawidłowe adresy.

Krok 3b: przekierowanie do konkretnej funkcji z parametrem:

$url[0]($url[1]);

Dzięki tej instrukcji, jeżeli będziemy mieli adres przykladowy-adres.pl/lista/nowe wywoła nam się funkcja lista() z parametrem nowe. W tym przypadku jednak zalecam skorzystanie już z mechanizmu call_user_func lub własnej logiki, która będzie odporna na próby infiltracji i obsługi błędnych adresów.

Podsumowanie

Jak widać dla chcącego nic trudnego. Taka obsługa adresów URL może być początkowo trudna, jednak zyskujemy w ten sposób praktycznie całkowitą niezależność i łatwość integracji z usługami zewnętrznymi. Ostatecznie, kod który odpowiada za wykonanie funkcji i wyświetlenia widoku aplikacji jest dużo bardziej złożony. Pamiętaj aby budując aplikację internetową od podstaw mieć na uwadze kwestie jakościowe takich obszarów jak user experience, bezpieczeństwo i SEO.

Oceń artykuł na temat: Routing i parsowanie adresu URL w PHP
Średnia : 4.7 , Maksymalnie : 5 , Głosów : 22