广

PHP编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    回答PHPCHINA上的几个问题:URL映射

    2018-10-28 11:05:18 次阅读 稿源:互联网
    零七广告
    PHPCHINA服务器搬迁后,我就基本上上不去了,只能用代理,郁闷。但用代理居然不能发帖,回帖。做为版主,深感遗憾,今天用代理上去看到了几个帖子,顺便在这里回答下。

       1、大家来说说URL映射吧
       一般url映射有两种方式,一种是通过mod_rewrite实现,这种网上教材很多我也不多说了。另外一种是在程序中模拟,比如类似zend Framework中的那种方式/index.php/controller/action/var1/value1/var2/value2/。这里方式其实最主要是通过一个统一的输入接口,然后对url进行解析,最后转发到相应的controller中的module。

        我这里写了两个简单函数来模拟。
        第一个函数主要是进行地址解析,把类似/index.php/controller/action/var1/value1/var2/value2/的地址解析出来,一般来说要解析成三部分:controller,module,params。 
    代码如下:

    <?  
    /**  
      *对url路由进行简单的解析,支持对/path/to/site/index.php/module/action/parm/value  
      * /path/to/site/index.php?/module/action/parm/value和  
      * /path/to/site/?/module/action/parm/value三种形式的处理  
      *@param:null  
      *@return:router array  
      */  
    function url_router(){  
       $path=strip_tags($_SERVER['REQUEST_URI']);  
       $strpos=strpos($path,'.php');  
       if($strpos){  
           $path=substr($path,$strpos+4);    
       }else{  
           if(empty($_SERVER['QUERY_STRING'])){  
               $strpos=strpos($path,'?');  
               if($strpos){  
                  $path=substr($path,$strpos+1);  
               }else{  
                  $path='';  
               }  
           }else{  
               $path=$_SERVER['QUERY_STRING'];  
           }  
       }  
       //统一化$path的格式,如果$path的第一个字符为/则去掉  
       if($path[0]=='/'){  
           $path=substr($path,1);  
       }  
       //解析,并且路由  
       if(!empty($path)){  
           $path=explode('/',$path);  
           $router['controller']=$path[0];  
           $router['action']=(!empty($path[1]))?$path[1]:'index';  
           //print_r($path);  
           for($i=2;$i<sizeof($path);$i=$i+2){  
               $params[$path[$i]]=(isset($path[$i+1]))?$path[$i+1]:'';  
           }  
           $router['params']=$params;  
       }else{  
           //默认路由信息  
           $router['controller']='index';  
           $router['action']='index';  
           $router['params']=array();  
       }  
       return $router;  
    }  
    ?> 
     

        这里就完成主要的url解析功能,然后是转发映射,下面这个函数实现(注意这个函数的实现是结合了我自己的架构,所以你采用的话需要相应的修改,当然你的MVC如果类似zend Framework,那应该要该的不多。)

    代码如下:

    <?  
    function url_dispatch($router,$app_path='/app/controllers/')  
    {  
       require_once(SERVER_PATH.'/libs/controller.class.php');  
       $controller=$router['controller'].'Controller';  
       //echo SERVER_PATH.$app_path.$controller.'.class.php';  
       if(!file_exists(SERVER_PATH.$app_path.$controller.'.class.php'))die('缺少必要的类!');  
       require_once(SERVER_PATH.$app_path.$controller.'.class.php');  
       $controller=new $controller();  
       $controller->_setParam($router['params']);  
       $controller->{$router['action'].'Action'}();  
       return true;  
    }  
    ?>  

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告