Сделал свой mvc каркас, но не знаю как лучше организовать Router.
1) Использовать $_GET параметры вида /site/?controller=news&action=index
2) Разбивать URL на сегменты:
3) Прописывать роуты в виде массива:
$routes = array(
'news' => 'news/index',
'news/([0-9])' => 'news/view'
)
Затем циклом с помощью регулярных выражений искать совпадения в $_SERVER['REQUEST_URI'], и соответственно выполнять дальнейшие действия.
В 1 и 2 случае controller и action определяются автоматически.
В 3 Необходимо прописывать роуты зарание, как в laravel Route::get('/', 'maincontroller@index');
Сергей delphinpro, как тогда обрабатывать запрос вида
site/news/?page=2&filter=sport например?
Загвостка в том что
$routes[2] = news
$routes[3] = ?page=2&filter=sport.
т.е. при таком подходе нельзя получить $_GET параметры.
Владимир Борисюк,
зачем их получать в роутере?
вы по /news/ определите контроллер и экшен. А экшен сам прочитает параметры запроса и попросит у модели нужные данные. Или как там у вас, неважно.
Суть в том, что параметр это и есть параметр, от него не зависит какой контроллер использовать. От него зависит какие данные показывать.
public function itemAction($id) { }
public function listAction() {
// гет параметры
$filter = Request::get('filter');
$page = Request::get('page');
...
}
Проверяю совпадения маршрута
foreach($routes as $k => $v){
if(preg_match('#'.$k.'#' $uri)){
Если есть совпадение - указать новый URI
$uri = preg_replace('#'.$k.'#', $v, $uri);
break;
}
}