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.