-
<?php
/*
* 小黄牛PHP博客 - 基于单一入口PHP框架Path_Info模式路由功能实现
* 作者:冯俊豪
* 什么是PHP - Path_Info模式路由?请看如下URL地址:
* http://www.im158.com/index.php/index-showlist.html
* 从如上地址中我们无法再像普通路由那样“直观”的看见C和M的存在,只能在index.php后面看到两个用-符号分割的“伪参数”,控制器(controllers)和方法(method)
* Path_Info模式路由的关键就在于,我们如果从URL中提炼出C和M的存在,然后返回给GET让路由器去进行解析
* 就像上面的URL,当前访问的是Index控制器下的Showlist方法,并进行了伪后缀伪装
* 话不多说,我们立刻来看下代码吧
* 测试URL如下:
* http://127.0.0.1/ 访问默认控制器和方法
* http://127.0.0.1/index.php/Ceshi-Showlist.html 访问Ceshi控制器下的Showlist方法
*/
-
//控制器基类
class Controller {
//Path_Info路由需要以下的四个成员来初始化Index首页模板
private $controller = 'index'; //默认控制器
private $method = 'index'; //默认方法
private $url_split = '-'; //路由分隔符
private $url_suffix = '.html'; //URL后缀名
//获取并自动加载对应的控制器、方法
public function Curl() {
//解析URL
$this->Analysis();
//如果参数C存在则获得控制器名,不存在则加载默认控制器
$Controller = !empty($_GET['c']) ? $_GET['c'] : $this->controller; //获得当前控制器名称
$Controller .= 'Controller'; //加上控制器后缀名
//同上
$Method = !empty($_GET['m']) ? $_GET['m'] : $this->method; //获得当前方法名称
//自动加载控制器
$instance = new $Controller();
//访问对应的操作方法
$instance->$Method();
}
//需要用这个方法来解析URL,并对C和M重新赋值
public function Analysis(){
if(isset($_SERVER['PATH_INFO'])){
//$_SERVER['PATH_INFO']URL地址中文件名后的路径信息, 不好理解, 来看看例子
//比如你现在的URL是 http://www.im158.com/index.php 那么你的$_SERVER['PATH_INFO']就是空的
//但是如果URL是 http://www.im58.com/index.php/abc/123
//现在的$_SERVER['PATH_INFO']的值将会是 index.php文件名称后的内容 /abc/123/
$path = trim($_SERVER['PATH_INFO'],$this->url_split); //删除最末尾的分隔符
$paths = explode($this->url_split, $path); //将URL分割成数组
//如果参数C存在则获得控制器名,不存在则加载默认控制器
$Controller = str_replace('/','',$paths[0]); //获得C参数,并将左侧的/符号删除
$Method = str_replace($this->url_suffix,'',$paths[1]); //获得M参数,并将右侧的伪后缀删除
//这里对控制器重新赋值
$_GET['c'] = $Controller;
//同上
$_GET['m'] = $Method;
}
}
}
-
-
//测试控制器-Index
class IndexController{
public function Index(){
echo '这是IndexController控制器下的Index方法';
}
public function Showlist(){
echo '这是IndexController控制器下的Showlist方法';
}
}
//测试控制器-Ceshi
class CeshiController{
public function Index(){
echo '这是CeshiController控制器下的Index方法';
}
public function Showlist(){
echo '这是CeshiController控制器下的Showlist方法';
}
}
//实例化控制器
$res = new Controller();
//加载路由监控
$res ->curl();
-
PHP路由模式Path_Info模式
最新推荐文章于 2022-10-12 11:23:49 发布