关闭

PHP路由模式Path_Info模式

标签: PHP
319人阅读 评论(0) 收藏 举报
  1. <?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方法  

    */

  2. //控制器基类

    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;

    }

    }

    }

  3. //测试控制器-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();


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:29916次
    • 积分:8
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:44篇
    • 译文:1篇
    • 评论:0条
    文章分类