PHP路由模式Path_Info模式

转载 2016年05月30日 16:40:38
  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();


相关文章推荐

php 解析pathinfo 类

class Prourl { /** * URL路由,转为PATHINFO的格式 */ static function parseUrl(){ if (isset($_SE...
  • ebw123
  • ebw123
  • 2012年10月22日 10:48
  • 1850

PHP简单实现MVC框架路由功能模式

说到使用PHP进行网站开发,自然离不开各种PHP的开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等等,让我们的开发更为快捷方便。但是很多人只是会使用框架,却从来不去了解框架的内部...

PHP搭建自己的web框架-路由

路由指URL路由,通过解析URL参数找到执行的(控制器的)方法。 通过URL,能找到目标类和目标方法,通常使用pathinfo或参数。比如: pathinfo :http://...
  • rariki
  • rariki
  • 2016年01月03日 14:12
  • 2578

php url路由入门实例

一、什么是php的路由机制 1、路由机制就是把某一个特定形式的URL结构中提炼出来系统对应的参数。举个例子,如:http://main.test.com/article/1  其中:/article...

PHP中的$_SERVER['PATH_INFO']

PHP中的全局变量$_SERVER['PATH_INFO']是一个很有用的参数,众多的CMS系统在美化自己的URL的时候,都用到了这个参数。 对于下面这个网址: http://www.te...

$_SERVER['PATH_INFO']

PHP中的全局变量$_SERVER['PATH_INFO']是一个很有用的参数,众多的CMS系统在美化自己的URL的时候,都用到了这个参数。 对于下面这个网址: http://www.te...

PHP开启PATH_INFO访问

Apache2.2.22开启PathInfo模式的支持 小柒 小柒 2013-03-12 18:46:59 昨天新配置了一个PHP集成开发环境,安装完后,把项目放到Apache服务器的www目录下...

ThinkPHP的四种路由形式

1.基本get形式 http://网址/index.php?m=分组&c=控制器&a=操作方法 该方式是最底层的get形式、传统的参数传递方式,不时尚、不安全。 2.path...

基于原生PHP的路由分配实现

对于由原生PHP写成的独立PHP框架,利用单一入口文件实现路径的访问。这时我们会遇到的首要问题是:文件的相互包含,其次就是路由分配。当我们不利用成熟的PHP框架进行web开发时,我们就会发现上述两个问...

nginx的php fastcgi模式PATH_INFO解决办法Magento正常

今天vps上的一个朋友需要安装Magento,但是安装的时候出现404错误. 文件无错,文件夹以及绑定都没问题,但是还是出现404错误. 搞了很久才知道原来是php的PATH_INFO引起的问题....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP路由模式Path_Info模式
举报原因:
原因补充:

(最多只允许输入30个字)