根据斜杠分隔字符串执行页面 url 路由

问题描述 投票:0回答:2

我正在使用 PHP 爆炸功能。该函数用于检测页面URL。

在我们的网站设置中,页面 URL 为:

  1. /app/home/ (主页)
  2. /app/answers/list (搜索列表页面)
  3. /app/answers/detail/a_id/309 (答案详情页)
  4. /app/answers/list/session/L3NpZC9WVmpBQWlxaw%3D%3D

目前,我正在使用explode函数来分割字符串并将它们存储在一个数组中。

$currentLocation  =explode("/",$_SERVER["REQUEST_URI"]);

Array ( [0] => [1] => app [2] => answers [3] => list [4] => session [5] => L3NpZC9WVmpBQWlxaw%3D%3D ) 

然后还有很多IF Else条件语句:

if ($currentLocation [2]=='home')
        {
            $this->data['pageURL']=$currentLocation [2]; //Home directory
        }
        else if($currentLocation [2]=='answers')
        {
            $this->data['pageURL']= $currentLocation [4];
        }

我想知道是否有一种聪明的方法可以实现这一目标。谢谢。 URL 的 /app/ 部分始终是固定的,其余部分会发生变化。

干杯, 庆

php string split url-routing delimited
2个回答
1
投票

通常,当您有很多这样的 if/else 条件时,更常见的是使用

switch
语句来代替:

switch $currentLocation[2] {
    case 'home' : $this->data['pageURL']=$currentLocation[2]; break;
    case 'answers' : $this->data['pageURL']= $currentLocation[4]; break;
    default: $this->data['pageURL']= $currentLocation[4]; break;
}

它比一堆

elseif
块更整洁,尽管代码并没有少多少。

但是在这种情况下,我想说,使用一组重写规则可能会获得更好的结果。您尚未指定它,但鉴于您所描述的 URL,您可能在服务器配置中使用 mod_rewrite (或类似的)将“友好”URL 重定向到实际的 PHP 页面?

这是我建议工作的地方。通过使用一组 mod_rewrite 规则,您可以让 PHP 页面接收正常的

$_GET
变量。

mod_rewrite 允许您拥有类似

/app/answers/detail/a_id/309
的 URL,但 PHP 程序会接收它,就像用户输入了
app.php?page=answers&section=detail&a_id=309
一样。重写规则基于正则表达式,您可以使它们变得非常复杂,以允许各种不同的 URL 格式。

如果你实现了这一点,你可能会放弃在程序中使用

explode()
所做的所有工作,然后挑选出 URL 的相关位,并将其全部替换为服务器配置中的大约五行(
.htaccess 
)。

希望有帮助。


1
投票

寻找

Zend framework Router

© www.soinside.com 2019 - 2024. All rights reserved.