PHP中基于开关的URL路由

PHP中基于开关的URL路由,php,url-routing,Php,Url Routing,我目前正在做的是: 我有一个$path变量,它是index.php/(我用.htaccess隐藏)后面的所有内容,直到一个问号,可以忽略查询字符串 然后,我对该变量使用带有preg_matchcases的开关来确定它应该调用什么脚本。例如: switch (true) { case preg_match('{products/view/(?P<id>\d+)/?}', $path, $params): require 'view_product.php'; b

我目前正在做的是:

我有一个
$path
变量,它是index.php/(我用.htaccess隐藏)后面的所有内容,直到一个问号,可以忽略查询字符串

然后,我对该变量使用带有
preg_match
cases的
开关来确定它应该调用什么脚本。例如:

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

  ...  

  default:
    require '404.php';
  break;
} 
开关(真)
{  
案例预匹配(“{products/view/(?P\d+/?”),$path,$params):
需要“view_product.php”;
打破
...  
违约:
需要'404.php';
打破
} 
这样,我就可以使用
$params['id']
访问产品id,如果需要,还可以使用querystring进行筛选、分页等


这种方法有什么问题吗?

你不应该像这样使用
开关

最好使用数组和
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';
}
$rules=数组(
“{products/view/(?P\d+/?”}=>“view_product.php”
);
$found=false;
foreach($pattern=>$target的规则){
if(预匹配($pattenr、$path、$params)){
需要$target;
$found=true;
打破
}
}
如果(!$found){
需要'404.php';
}

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


在第二部分中,您可以使用parse_url php函数代替regex witch,这将使您的脚本速度加快一点。

Whoa。就这么简单吧?谢谢,伙计。似乎比我的方法要好得多。:)