【问题标题】:Simple PHP routing简单的 PHP 路由
【发布时间】:2009-12-08 05:02:30
【问题描述】:

我正在为我正在制作的新的自定义 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();
    }

我该怎么做?

【问题讨论】:

  • 你使用的是哪个 MVC 框架?
  • @Jonathan,如问题中所述,我使用自定义框架(为了学习而学习)......因此我可以选择我想要的任何东西。我知道必须有一个简单的解决这个问题的方法,我只是想念它......谢谢!

标签: php url-routing


【解决方案1】:

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

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

这将使您将逻辑保留在控制器本身内部,而不是在不同文件之间爆炸。

【讨论】:

  • 我想我明白 oyu 的意思......你的意思是,如果我的控制器中有一个 index() 方法,它在没有提供的方法或没有找到方法的情况下被调用 - 银行有那个因为参数不匹配而调用的方法,然后在该方法中将 URI 分开?
  • 我的意思是你应该有一个 missingMethod() 方法,当一个不存在的方法被请求时被调用。在 Kohana 中,请求的方法作为第一个参数传入,提供的参数紧随其后。只需将这些修补到您的 index() 方法中,您就应该准备就绪。
  • 您在我提交评论之前进行了编辑...并且您回答了我的问题,我想...hrm,我对此感到怀疑,但我通过深入研究这个框架而回过神来,它现在不难做到:)这可能是个好主意哈哈
  • 我在考虑结构。此方法将允许您将控制器逻辑保留在控制器中:)
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2015-12-14
  • 1970-01-01
相关资源
最近更新 更多