MVC读取控制器和动作的URL

时间:2011-05-01 21:11:52

标签: php url-routing

我为php编写了自己的mvc,它似乎对我来说很好。但是我在获取控制器和操作时遇到了麻烦:

http://www.example.com/controller/action

这样可以正常工作,但只要对网址进行细微更改,我的代码就会破坏appart。例如:

http://www.example.com/controller? thi休息,说controller?不存在,

http://www.example.com/controller/action? thi休息,说action?不存在,

我无法弄清楚为什么需要?在那里,如果有任何身体知道更强大,以获得正确的控制器和行动,我很想知道。

这是我的代码:

使用.htaccess

将所有请求重定向到相同的index.php页面
class Framework {

   ....

   private function setup() {
     $uri = (isset($_SERVER['REQUEST_URI']))?$_SERVER['REQUEST_URI']: false;
     $query = (isset($_SERVER['QUERY_STRING']))?$_SERVER['QUERY_STRING']: '';
     $url = str_replace($query,'',$uri);
     $arr = explode('/',$url);
     array_shift($arr);
     $this->controller =!empty($arr[0])?$arr[0]:'home';
     $this->action = isset($arr[1]) && !empty($arr[1])?$arr[1]:'index';
   }
}

2 个答案:

答案 0 :(得分:2)

$ _ SERVER ['QUERY_STRING']不包含?,因此当您执行$url = str_replace($query,'',$uri);时,您不会替换?。因此,它正在寻找名为controller?

的控制器

围绕这个

有各种各样的方法
  • 替换为'?'.$query
  • 使用explode('?', $url)将查询字符串与URI
  • 分开
  • 获取$_SERVER['REQUEST_URL'](不包含查询字符串),而不是获取整个内容然后自行拆分

就个人而言,我会选择最后一个选项,因为只要代码已经为您编写,它往往比您可以编写的任何代码更快更强大。

答案 1 :(得分:1)

您应该在/

之前使用?来解决问题