Routing - z czym to się je?

Pierwsze i zasadnicze pytanie: co to jest routing? Dlaczego coś takiego jest lepsze niż proste przepisywanie adresów w pliku .htaccess? Jak napisać własny, prościutki router?

Routing to proces przetwarzania otrzymanego adresu żądania i na jego podstawie decydowanie, co powinno zostać uruchomione i/lub wyświetlone. Prosty przykład: nasza aplikacja składa się z dwóch plików: index.php i 404.php. Po otrzymaniu od przeglądarki żądania /index, aplikacja uruchamia plik index.php, w przeciwnym razie, 404.php.

Można zadać pytanie: ale dlaczego coś takiego jest lepsze niż proste przepisywanie adresów w pliku .htaccess? Cóż, w powyższym przypadku faktycznie wystarczy takie podejście. Jednak w przypadku większej aplikacji, czy nawet zwykłej strony z większą liczbą podstron dobrze jest mieć jedną kopię kodu aplikacji, a zależnie od otrzymanego adresu żądania (REQUEST_URI), decydować tylko o tym, jakie zasoby dodatkowo uruchomić, czy najzwyczajniej w świecie, jaką treść strony wstawić w zdefiniowany wspólny layout.

Weźmy jako przykład aplikację korzystającą z Zend Frameworka. Typowy dla Zenda plik .htaccess kieruje cały ruch do pliku index.php:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Niezależnie od tego, co wpiszemy po adresie strony, nasze żądanie i tak zostanie przekierowane do pliku index.php. Stamtąd trafi do front controllera, gdzie żądanie zostanie przetworzone, a na jego podstawie zostanie stworzona instancja odpowiedniego kontrolera i uruchomiona odpowiednia akcja tegoż kontrolera. Innymi słowy, to tutaj zostanie podjęta decyzja, czy odpalić stronę główną, czy np. formularz dodawania nowego wpisu w panelu administratora.

Przenieśmy to zatem na prawdziwy przykład i stwórzmy prosty przykład aplikacji, gdzie wykorzystamy najprostszy router.

Plik .htaccess niech ma zawartość przedstawioną powyżej.

Stwórzmy również katalog /views, gdzie umieścimy później pliki widoków, oraz nasz główny plik aplikacji, czyli index.php. W nim umieścimy nasz router.

Kod routera

Aby zabrać się za routing żądań wysyłanych do naszej aplikacji, musimy zacząć od sprawdzenia najważniejszej rzeczy, czyli adresu żądania:

$uri = $_SERVER["REQUEST_URI"];

Jeśli mamy dla naszej aplikacji utworzony virtual host, możemy potestować sobie, co zawiera zmienna $uri.

die($uri);

Jeśli wpiszemy adres naszej aplikacji (powiedzmy, że www.example.com), otrzymamy adres /. Dla www.example.com/foo/bar — dostaniemy /foo/bar.

Żeby nasza aplikacja miała co wyświetlać, stwórzmy parę plików w katalogu /views.

/views/header.php:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>Test routerów</title>
</head>
<body>

/views/footer.php

</body>
</html>

Powyższe dwa pliki posłużą nam za layout — w zasadzie tylko po to, żeby mieć poprawną strukturę dokumentu HTML. Dodajmy jeszcze jakąś zawartość, dowolny HTML w plikach /views/index.php, /views/about.php i /views/portfolio.php. Na koniec zadbajmy o jakąś stronę błędu i dodajmy jeszcze plik /views/404.php, gdzie możemy wpisać informację o błędzie.

Teraz spróbujmy przetworzyć żądanie i wyświetlić odpowiedni dokument. Użyjemy bardzo prostego wyrażenia switch-case w pliku index.php w katalogu głównym. Kompletny kod pliku jest następujący:

$uri = $_SERVER["REQUEST_URI"];
include "views/header.php";
switch ($uri) {
    case "/":
        include "views/index.php";
        break;
    case "/o-mnie":
        include "views/about.php";
        break;
    case "/portfolio":
        include "views/portfolio.php";
        break;
    default:
        include "views/404.php";
        header("HTTP/1.0 404 Not Found");
        break;
}
include "views/footer.php";

Jak widać, nie ma tu żadnej filozofii: za pomocą switch-case wyświetlamy odpowiedni plik dla prawidłowych adresów, a dla wszystkich pozostałych używamy strony błędu.

Warto zwrócić uwagę na kod wewnątrz bloku default. Na stronie błędu mamy jeszcze dodatkowo zwrócony za pomocą nagłówka kod błędu 404. To niby drobnostka, ale zawsze należy o tym pamiętać. Kod 404 tak naprawdę nie jest dla odwiedzającego stronę, ale dla wyszukiwarki internetowej, indeksującej naszą stronę. Jeśli pod jakimś nieistniejącym adresem otrzyma poprawny kod HTML i kod 200 (OK), to może zaindeksować stronę błędu, a tego chyba nikt nie chce.

Wracając jednak do tematu, nasz router jest gotowy. Jest oczywiście niezwykle prosty, ale może posłużyć jako podstawa do zbudowania bardziej złożonej aplikacji. Zapraszam do pobrania gotowego kodu powyższej miniaplikacji w sekcji „Do pobrania”.


Komentarze

marcin

2013-09-24, 13:25

Coś cik link nie śmiga:

http://dominikmarczuk.pl/download/2013/05/router.tar.gz


Napisz komentarz


Do pobrania


Szukaj wpisów


Chmura tagów