为MVC Framework构建URL规则映射

时间:2013-08-23 21:49:41

标签: php

我在网上学习了一些教程之后构建了自己的PHP MVC框架。我使用.htaccess中的条目脚本完成了所有工作,如下所示:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]

我有一个Router类,它基本上会转换URL并将其分成动作/控制器段:

$route = (empty($_GET['rt'])) ? '' : $_GET['rt'];

if (empty($route))
{
    $route = 'index';
}
else
{
    /*** get the parts of the route ***/
    $parts = explode('/', $route);
    $this->controller = $parts[0];

    if(isset( $parts[1]))
    {
        $this->action = $parts[1];
    }
}

我想要做的是更进一步,实际定义除自动路由之外还有效的URL重写规则。所以基本上我希望能够做到这样的事情:

$rules = array(
    'directory/listing/<id>' => 'listing/index',
    'directory/<category>/<location>' => 'directory/view',
);

在上面,数组键是输入的URL - 尖括号中的部分是动态变量(如GET变量)。数组值是请求需要路由到的位置(控制器/操作)。因此,对于上述两个规则,我们有以下两个操作:

public function actionIndex($id) {
}

public function actionView($category, $location) {
}

所以基本上URL需要首先检查数组键,如果它匹配其中一个键,那么它需要使用数组值作为控制器/动作对。

任何人都有任何想法如何去做?

1 个答案:

答案 0 :(得分:0)

我不确定在您的环境中实现此操作所需的确切代码,但我可以提到这正是Magento的URL重写功能的方式。他们的网址结构为<controller>/<action>/<arguments>。他们甚至更进一步,将键/值对定义为URL参数,以便../id/20/meta/25变成一个数组,如下所示:

array(
    'id' => 20,
    'meta' => 25
)

你可以download their source并查看它。它可能会帮助您朝着正确的方向前进: