Jakiś czas temu pisałem o routingu w Kohana 3.1, w którym to wpisie stwierdziłem, że nie działają mi nazwane podwzorce (named subpattern) pomimo tego że mam wersję PHP wyższą niż minimalna wymagana 5.2.2. Trafiłem jednak na wpis nospora „Ładne url’e (nice url)” i postanowiłem mimo wszystko powrócić do tematu routingu i powalczyć z tymi wyrażeniami regularnymi.
Może to kwestia konfiguracji komputera – gdyż eksperyment przeprowadzałem na innym kompie niż poprzednio ale tym razem okazało się, że jednak da się w PHP nadawać nazwy wycinkom wzorca.
<?php // Przykładowe urle $urls = array( '/pl/news/list/1/', '/news/list/1/', '/news/list/', ); // Ścieżka która pasuje do powyższych urli - parametry lang i page są opcjonalne $route = '%^/((?P<lang>\w{2})/)?(?P<controler>\w+)/(?P<method>\w+)/((?P<page>\d+)/)?$%'; // Definicja wartości domyślnych parametrów opcjonalnych $defaults = array('lang' => 'pl', 'page' => 1); // Odczytanie ze ścieżki nazw parametrów preg_match_all('/P\<(\w+)\>/', $route, $matches, PREG_PATTERN_ORDER); $params = $matches[1]; foreach ($urls as $url) { // Założyłem w przykładzie, że wszystkie urle pasują do ścieżki // więc nie sprawdzam czy tak jest preg_match($route, $url, $matches); $vars = array(); foreach ($params as $param) { // Oczytanie z urla wartości parametrów lub nadanie wartości domyślnych $vars[$param] = (isset($matches[$param]) && !empty($matches[$param])) ? $matches[$param] : $defaults[$param]; } print $url."<br />"; print_r($vars); } ?> |
Wynikiem wywołania powyższego kodu jest
/pl/news/list/1/
Array ( [lang] => pl [controler] => news [method] => list [page] => 1 )
/news/list/1/
Array ( [lang] => pl [controler] => news [method] => list [page] => 1 )
/news/list/
Array ( [lang] => pl [controler] => news [method] => list [page] => 1 )
Wyżej przytoczony przykład to tylko proof of concept, którego stworzenie nie zajęło mi więcej czasu niż wpisanie tych paru słów komentarza. Daje on jednak pojęcie jak łatwe i przyjemne jest stworzenie routingu w oparciu o nowe możliwości wyrażeń regularnych (nowe w PHP :)).