Как и следовало ожидать, существует много способов сделать это.
Например, в Slim Framework, пример двигателя маршрутизации может быть folllowing (на основе модели ${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/[email protected]',
'matches' => array('Application' => 'Members', 'Module' => 'Login'),
),
'o' => array(// Output - how the router parse a query string into a route
'@Application=Members(&|&)Module=Login/[email protected]' => 'Members/Login/'
)
);
Вы также можете использовать более сложные комбинации, такие как:
$_FURLTEMPLATES['article'] = array(
'i' => array(
'pattern' => '@CMS/Articles/([\d]+)/[email protected]',
'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 - очень простой и красивый код.
Однако, если вы хотите разработать сложные сайты, используя его, я думаю, что регулярное выражение является решением.
Удачи вам! :)
Второй пример - это то, что я действительно думал о том, что я делаю ... (стиль RoR). Я просмотрю ваш код. – Mez 2008-09-25 07:08:06