正如您所料,有很多方法可以做到这一点。
例如,在 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 等)获取一个方法,并将路由作为第一个参数,将回调作为第二个参数。
路由可以获得令牌 - 这是“变量”,会在运行时根据一些数据(例如成员名称、文章 ID、组织位置名称或其他任何东西 - 你知道,就像在每个路由控制器中一样)发生变化。
就个人而言,我确实喜欢这种方式,但我认为它对于高级框架来说不够灵活。
由于我目前正在与 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'
)
);
在我看来,最重要的是可能性是无穷无尽的,这取决于你希望你的框架有多复杂以及你希望用它做什么。
例如,如果它只是打算成为一个 Web 服务或简单的网站包装器 - 只需使用 Slim 框架的写作风格 - 非常简单且美观的代码。
但是,如果您想使用它开发复杂的网站,我认为正则表达式是解决方案。
祝你好运! :)