PHP中基于交换机的URL路由

时间:2011-01-04 15:58:07

标签: php url-routing

我目前正在做的是:

我有一个$path变量,它是 index.php / (我用.htaccess隐藏)之后的所有内容,最多都是一个问号,忽略了查询字符串。

然后我在该变量上使用switch preg_match个案例来确定它应调用的脚本。例如:

switch (true)
{  
  case preg_match('{products/view/(?P<id>\d+)/?}', $path, $params): 
    require 'view_product.php'; 
  break;

  ...  

  default:
    require '404.php';
  break;
} 

这样我就可以使用$params['id']访问产品ID,如果需要,可以使用查询字符串进行过滤,分页等。

这种方法有什么问题吗?

2 个答案:

答案 0 :(得分:3)

你不应该像这样使用switch

更好地使用数组和foreach之类的:

$rules = array(
    '{products/view/(?P<id>\d+)/?}' => 'view_product.php'
);
$found = false;
foreach ($rules as $pattern => $target) {
    if (preg_match($pattenr, $path, $params)) {
        require $target;
        $found = true;
        break;
    }
}
if (!$found) {
    require '404.php';
}

答案 1 :(得分:0)

错误的部分是开关盒。作为一种更好的做法,我建议你将所有正则表达式存储到一个数组中并用它进行测试。将路由保存到配置文件,或者ini文件或数据库或xml或者其他任何会使您长期生活更轻松(如果您需要编辑/添加/删除新路由)将更容易。

在第二部分你可以使用parse_url php函数代替正则表达式,这会让你的脚本速度变慢。