Как и следовало ожидать, есть много способов сделать это.
Например, в Slim Framework примером механизма маршрутизации может быть следующий (на основе шаблона ${OBJECT}->${REQUEST METHOD}(${PATTERM}, ${CALLBACK})
):
$app->get("/Home", function() {
print('Welcome to the home page');
}
$app->get('/Profile/:memberName', function($memberName) {
print( 'I\'m viewing ' . $memberName . '\'s profile.' );
}
$app->post('/ContactUs', function() {
print( 'This action will be fired only if a POST request will occure');
}
Итак, инициализированный экземпляр ($app
) получает метод для каждого метода запроса (например, get, post, put, delete и т. Д.) И получает маршрут в качестве первого параметра и обратный вызов в качестве второго.
Маршрут может получать токены - которые являются «переменными», которые будут меняться во время выполнения на основе некоторых данных (таких как имя члена, идентификатор статьи, название организации или как угодно - как вы знаете, как в любом контроллере маршрутизации).
Лично мне нравится такой способ, но я не думаю, что он будет достаточно гибким для продвинутых фреймворков.
Поскольку я сейчас работаю с ZF и Yii, у меня есть пример маршрутизатора, который я создал как часть инфраструктуры для компании, в которой я работаю:
Механизм маршрутизации основан на регулярном выражении (аналогичном @ gradbot), но получил двустороннюю беседу, поэтому, если ваш клиент не может запустить mod_rewrite (в Apache) или добавить правила перезаписи на своем сервере, он или она все еще может использовать традиционные URL со строкой запроса.
Файл содержит массив, каждый из которых, каждый элемент похож на этот пример:
$_FURLTEMPLATES['login'] = array(
'i' => array( // Input - how the router parse an incomming path into query string params
'pattern' => '@Members/Login/?@i',
'matches' => array( 'Application' => 'Members', 'Module' => 'Login' ),
),
'o' => array( // Output - how the router parse a query string into a route
'@Application=Members(&|&)Module=Login/?@' => 'Members/Login/'
)
);
Вы также можете использовать более сложные комбинации, такие как:
$_FURLTEMPLATES['article'] = array(
'i' => array(
'pattern' => '@CMS/Articles/([\d]+)/?@i',
'matches' => array( 'Application' => "CMS",
'Module' => 'Articles',
'Sector' => 'showArticle',
'ArticleID' => '$1' ),
),
'o' => array(
'@Application=CMS(&|&)Module=Articles(&|&)Sector=showArticle(&|&)ArticleID=([\d]+)@' => 'CMS/Articles/$4'
)
);
Суть, как я думаю, в том, что возможности безграничны, все зависит от того, насколько сложным вы хотите, чтобы ваша структура была, и что вы хотите с ней делать.
Если, например, это просто веб-служба или простая оболочка для веб-сайта - просто используйте стиль написания Slim Framework - очень простой и красивый код.
Однако, если вы хотите разрабатывать сложные сайты с использованием этого, я думаю, что регулярное выражение является решением.
Удачи! :)