是否有可重用的PHP路由器/调度程序?

时间:2011-03-18 06:35:09

标签: php url-routing

我正在使用一个基于查询参数处理请求的简单框架。

http://example.com/index.php?event=listPage
http://example.com/index.php?event=itemView&id=1234

我想在此前面放置干净的网址,以便您可以这样访问:

http://example.com/list
http://example.com/items/1234

我知道路线和调度是如何工作的,我自己也可以写。但我宁愿利用已经解决了这个问题的所有代码。有没有人知道提供此功能的通用库或类,但是让我从路线匹配中返回我想要的任何内容?这样的事情。

$Router = new Router();
$Router->addRoute('/items/:id', 'itemView', array( 'eventName' => 'itemView' ));

$Router->resolve( '/items/1234' );
// returns array( 'routeName' => 'itemView',
//                'eventName' => 'itemView,
//                'params' => array( 'id' => '1234' ) )

基本上,我可以根据路径中解析的值自行调度。如果不是太麻烦(并且只要许可证允许),我不介意将其从框架中解除。但通常我发现框架中的路由/调度只是有点过于集成而不能像这样重新调整用途。我的搜索似乎表明,如果他们不使用框架,人们就会自己编写这些内容。

一个好的解决方案将支持以下内容:

  • 使用冒号表示法或正则表达式表示法指定路径
  • 解析路由中的参数并以某种方式返回
  • 支持快速反向查找,如下所示:

    $Router->get( 'itemView', array( 'id' => '1234' ) );
    // returns 'items/1234'
    

感谢任何帮助。

1 个答案:

答案 0 :(得分:8)

GluePHP可能非常接近你想要的。它提供了一个简单的服务:将URL映射到类。

require_once('glue.php');

$urls = array(
    '/' => 'index',
    '/(?P<number>\d+)' => 'index'
);

class index {
    function GET($matches) {
        if (array_key_exists('number', $matches)) {
            echo "The magic number is: " . $matches['number'];
        } else {
            echo "You did not enter a number.";
        }
    }
}

glue::stick($urls);