【发布时间】:2015-01-05 14:01:13
【问题描述】:
我遇到了不知道如何实现功能的情况, 我不确定什么是最好和更快的解决方案。
我有一个简单的 Routing 对象,非常基本,我不需要这个特定项目的高级功能......它存储了一组路由,唯一允许的方法是 GET 和 POST,这大致是类结构:
class Router
{
// Array of Route Objects
private static $binded_routes = array();
// Method used to register a GET route.
public static function get() {}
// Method used to register a POST route.
public static function post() {}
// Other methods here like redirect(), routeTo(), dispatch()
}
路由可以这样声明:
Router::get('index', 'IndexController@method');
Router::get('users/{id}', 'UserController@showUser');
Router::get('route/to/something', 'Controller@method');
Router::get('route/to/something/{param1}', 'Controller@method1');
Router::get('route/to/something/{param1}/{param2}', 'Controller@method2');
存储 GET 路由的策略是这样的:
- 只注册不带参数的路由(在本例中:索引、用户、 路线/到/某事)
- 在指定参数的地方将它们存储为数组
- 不要使用相同数量的参数存储多个 GET 路由(在此示例中声明 'users/{test}' 将引发错误)
路由对象是这样的:
class Route
{
private $route_type = 'GET';
private $route_name = null;
private $route_uri = null;
private $route_params = array();
private $route_controller = null;
private $route_method = null;
// Functions to correctly store and retrieve the above values
}
所以现在我在匹配 GET 请求时遇到了麻烦,根据我可以做点什么的政策 像这样:
- 遍历所有绑定的路由。找到完全匹配的,如果找到就停止。
-> 因此,如果用户转到“route/to/something”,我可以匹配第三条路线并将执行传递给正确的控制器。 - 如果未找到,则尽可能多地匹配路由并将其余路由作为参数。
-> 因此,如果用户转到“route/to/something/1/2”,我可以匹配“route/to/something”并将数组(1,2)作为参数 - 现在我可以简单地计算参数的数量并与路线进行比较以找到唯一具有相同数量的参数的路线。
目前我想不出一种方法来管理这个过程而无需多个 foreach 循环。 什么是最好的方法?有没有办法构造一个正则表达式?以及如何生成?
我们将不胜感激任何帮助,如果您需要更多信息,请告诉我。
【问题讨论】: