Wzorce projektowe: Router – cz. 1

Informacje wstępne

Co to takiego ten Router i do czego on służy? Podobnie jak od strony technicznej jest to pewien „byt” zajmujący się odnajdywaniem/trasowaniem/przekazywaniem zadanych żądań.
W programowaniu Router to jeden z tzw Wzorców Projektowych, które powstały po to aby w miarę spójnie rozwiązywać problemy przy projektowaniu systemów.

O wzorcach projektowych powstało na pewno wiele mądrych i obszernych książek więc nie ma sensu abym ja się tutaj rozpisywał. Po co nam ten Router? Routerem nazwiemy obiekt, który będzie się zajmował pobieraniem adresu z przeglądarki i przetwarzaniem go na akcję zrozumiałą dla pozostałych elementów systemu. To on będzie decydował o tym, co ma się pojawić na wyjściu gdy pojawi się coś na wejściu.

Przykład:
Jeśli wpiszemy w przeglądarce:

http://moja.strona/witaj

Router odbierze na wejściu „witaj” i wg jemu znanego systemu przekaże dalej to żądanie – np „powie” systemowi, że należy wyświetlić stronę z powitaniem. Inny przykład:

http://moja.strona/

Router może mieć zaprogramowane domyślne akcje w przypadku braku konkretnych żądań. Przykładowo jeśli nie podano nic na wejściu to Router przekaże, że należy wyświetlić stronę główną.

Implementacji takiego systemu jest tak wiele jak i programistów jednakże pewne zasady ze względu na wzorce projektowe i wymagania techniczne są niezmienne i konieczne do poprawnego zrealizowania zadania.

Implementacja

W kolejnych krokach postaram się opracować prostą ale w pełni funkcjonalną implementację takiej klasy. Zacznijmy od opracowania podstawowych metod tej klasy

[php]
class Router {

public static $current_uri = ”;

public static function get_uri()
{
if (!empty($_SERVER[’PATH_INFO’]))
{
self::$current_uri = $_SERVER[’PATH_INFO’];
}
}
}
[/php]

Pole $current_uri będzie przechowywać pobrany adres na wejściu – zostanie on użyty później.
Metoda get_uri() powinna zostać uruchomiona na początku działania systemu. Jej zadaniem jest pobranie z pola tablicy superglobalnej $_SERVER wartości PATH_INFO. Pod tym polem kryje się wszystko to co zostało zapisane za plikiem, który uruchama skrypt – np index.php. Zatem jeśli w przeglądarce wpiszemy:

http://moja.strona/index.php/konto/rejestracja

To PATH_INFO będzie zawierało wartość

/konto/rejestracja

Zmienna $current_uri została domyślnie zainicjowana na wartość pustą. Jeśli jednak PATH_INFO było niepuste to przypiszmy tą wartość do $current_uri.

Przykładowe wywołanie kodu:

[php]
Router::get_uri();
echo Router::$current_uri;
[/php]

Tyle ma do roboty Router jeśli chodzi o odbieranie danych.

Podsumowanie

To jest oczywiscie bardzo prosta implementacja jednakże w pełni skuteczna i wystarczająca do dalszej „obróbki”. W kolejnej części postaram się pokazać podstawowe sposoby zabezpieczenia wejścia i rozbijanie wejścia na konkretne akcje.

Następna część: Router cz. 2