简单的PHP路由

时间:2009-12-08 05:02:31

标签: php url-routing

我正在为我正在制作的新自定义MVC框架设置一个简单的路由系统。

目前我的路由器类会查看URL:

www.example.com/controller/controller_action/some/other/params

所以,基本上......我一直在为控制器路由预留URI的前两个部分。但是,如果我只想运行以下内容怎么办?

www.example.com/controller/some/other/params

...会尝试运行默认控制器操作并将额外参数发送给它吗?

这是我正在使用的简单路由器:

    \* --- htaccess --- *\
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]

    \* --- index.php --- *\
    if (array_key_exists('rt',$_GET)) {
        $path = $_GET['rt'];
        $uri = explode('/',$this->path);
        if(empty($uri[0])) {
            $load->ctrl('home');
        }
        elseif(empty($uri[1])) {
            $load->ctrl($uri[0]);
        }
        else {
            $load->ctrl($uri[0],$uri[1]);
        }
    }
    else {
        $load->ctrl('index');
    }

    \* --- loader class --- *\
    public function ctrl($ctrl,$action=null) {
        $ctrl_name = 'Ctrl_'.ucfirst(strtolower($ctrl));
        $ctrl_path = ABS_PATH . 'ctrl/' . strtolower($ctrl) . '.php';
        if(file_exists($ctrl_path)) { require_once $ctrl_path;}

        $ctrl = new $ctrl_name();

        is_null($action) ? $action = "__default" : $action = strtolower($action);
        $ctrl->$action();
    }

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以在控制器中处理此问题。通常,当请求的方法不可用时,MVC框架将调用默认方法。只需覆盖此fallback方法即可调用所需方法并将参数列表作为参数传递。

例如,当所请求的方法不存在时,KohanaPHP具有__call($method, $params)方法。您可以在其中处理逻辑,或在MVC框架中处理其功能等同物。

这样可以让逻辑保持在控制器本身的内部,而不是在各种文件之间进行抨击。