Podręcznik użytkownika CodeIgniter wersja 2.2.1


Routing URI

Zazwyczaj, pomiędzy ciągiem URL a klasą/metodą kontrolera występuje relacja jeden-do-jeden. Segmenty URI normalnie odpowiadają temu wzorcowi:

przyklad.pl/klasa/funkcja/id/

W niektórych przypadkach, możesz jednak chcieć zmienić tę relację, aby wywołać inną klasę/funkcję.

Dla przykładu, załóżmy że chcesz aby Twoje adresy URL miały taką postać:

przyklad.pl/produkt/1/
przyklad.pl/produkt/2/
przyklad.pl/produkt/3/
przyklad.pl/produkt/4/

Normalnie drugi parametr adresu URL jest zarezerwowany dla nazwy funkcji, ale w przykładzie powyżej mamy tam ID produktu. Aby temu zaradzić, CodeIgniter pozwala na mapowanie adresu URI.

Ustawianie własnych reguł routingu

Reguły routingu są zdefiniowane w pliku application/config/routes.php. W tym pliku znajdziesz tablicę o nazwie $route, która pozwala na określenie Twoich własnych kryteriów dotyczących routingu. Routing może zostać określony za pomocą wildcardów lub wyrażeń regularnych

Wildcardy

Typowy routing za pomocą wildcardów, może wyglądac w ten sposób:

$route['produkt/:num'] = "catalog/product_lookup";

W routingu, klucz tablicy zawiera adres URI, który zostanie dopasowany, a wartość tablicy zawiera adres docelowy, który powinien zostać przepisany. W powyższym przykładzie, jeśli słowo "produkt" zostanie odnalezione w pierwszym segmencie adresu URL, a numer w drugim segmencie, to zostanie wywołana klasa "catalog" oraz metoda "product_lookup".

Możesz dopasowywać określone wartości lub używać typów widlcard:

(:num) dopasuje segment, który zawiera tylko liczny.
(:any) dopasuje segment, który zawiera dowolne znaki.

Uwaga: Routing zostanie uruchomiony w takim porządku, w jakim został zdefiniowany. Zasady routingu, które zostały określone wcześniej (wyżej w pliku), są ważniejsze od tych, które znajdują się poniżej (niżej w pliku).

Przykłady

Mamy tutaj kilka przykładów routingu:

$route['dzienniki'] = "blogs";

Adres URL, który zawiera słowo "dzienniki" w pierwszym segmencie, zostanie zmapowany do klasy "blogs".

$route['blog/janek'] = "blogs/users/34";

Adres URL, który zawiera segmenty blog/janek zostanie zmapowany do klasy "blogs" oraz metody "users". Id zostanie ustawione na "34".

$route['produkt/(:any)'] = "catalog/product_lookup";

Adres URL, który w pierwszym segmencie zawiera "produkt" i cokolwiek w drugim segmencie, zostanie zmapowany do klasy "catalog" i metody "product_lookup".

$route['produkt/(:num)'] = "catalog/product_lookup_by_id/$1";

Adres URL ze słowem "produkt" w pierwszym segmencie i numerem w drugim, zostanie zmapowany do klasy "catalog" oraz metody "product_lookup_by_id", do której zostanie przypisany numer jako zmienna funkcji.

Ważne: Nie używaj początkowych/końcowych slashy.

Wyrażenia regularne

Jeśli wolisz, możesz użyć wyrażeń regularnych aby zdefiniować reguły routingu. Dozwolone jest każde poprawne wyrażenie regularne i referencje zwrotne.

Uwaga:  Jeśli używasz referencji zwrotnych musisz użyć składni ze znakiem dolara, a nie podwójnych backslashy.

Typowy RegEx routing może wyglądać w ten sposób:

$route['produkty/([a-z]+)/(\d+)'] = "$1/id_$2";

W powyższym przykładzie, adres URI podobny do produkty/koszule/123, spowodowałby wywołanie kontrolera koszule oraz funkcji id_123.

Możesz również mieszać użycie wildcardów oraz wyrażeń regularnych.

Zarezerwowane nazwy routingu

Mamy dwie zarezerwowane nazwy dla routingu:

$route['default_controller'] = 'welcome';

Ta definicja określa, który kontroler powinien zostać wywołany, jeśli adres URI nie zawiera żadnych danych. Taki przypadek będzie miał miejsce, kiedy użytkownicy załadują główny adres Twojej strony. W powyższym przykładzie załadowana zostanie klasa "welcome". Zachęcamy, aby zawsze posiadać określony domyślny routing - w innym przypadku domyślnie pojawiać się będzie strona błędu 404.

$route['404_override'] = '';

Ta definicja określa, który kontroler powinien zostać załadowany, jeśli określony kontroler nie może zostać znaleziony. Kontroler ten nadpisze domyślną stronę błędu 404. Nie będzie to miało wpływu funkcję show_404(), która nadal będzie ładowała domyślny plik error_404.php, który znajduje się w application/errors/error_404.php.

Ważne:  Zarezerwowane nazwy routingu muszą znaleźć się przed definicjami routingu zawierającymi wildcardy i wyrażenia regularne.