资讯专栏INFORMATION COLUMN

Thinkphp 终极路由解决方案(超级伪静态)闭包的爽快使用

izhuhaodev / 1490人阅读

  

在ThinkPHP中我们使用伪静态的时候会产生一些问题,从而不能够很方便在用apache的rewrite规则来解决,不过官方因为这个问题给大家提供了一种高级解决方案就是route
我在使用ThinkPHP做项目的时候遇到这样的事情 route的规则是要匹配一下控制器
这就是官方在路由的例子里面为什么不使用别的方式,我也纳闷官方为什么没有解决这个问题
看官方的例子,然后我在写我的需求

"URL_ROUTER_ON"   => true,
"URL_MAP_RULES"=>array(    
"new/top" => "news/index/type/top"
 )

你看官方的这个例子,就是解决的new控制器下top路径重写的问题
再看一个

"/^new/(d{4})/(d{2})$/" => "News/achive?year=:1&month=:2",
"new/:year/:month/:day"=>"News/read", // 静态地址和动态地址结合

这个也是必须匹配new 这个控制器
第一个路由匹配的网址基本上都http://www.xxx.com/new/top
第二个路由匹配的网址是http://www.xxx.com/new/5/3
第三个路由匹配的网址是http://www.xxx.com/new/2014/4/5
其他的官方例子不说了

 我们的需求呢?我们的需求是不体现控制器我们要的是这样子的网址 http://www.xxx.com/getMember.html 
 包括http://wwww.xxx.com/getMember/username/xxxxx.html
 http://www.xxx.com/1.html 包括http://www.xxx.com/1-1.html
 http://www.xxx.com/getContent/1.html

我们需要的,官方提供的这些常规方式都无法解决怎么办,不要着急,官方还提供了一种办法叫做闭包支持
这就是我今天所要说的终极路由解决方案————ThinkPHP超级伪静态模式。
其实要匹配/getMember或者匹配/getContent我们在正则中都很方便只需要一个^get(w{2,5})[^/]这样就能匹配了, 更超级的方式是get(w+[^/])这样就可以匹配了,下面开始说闭包支持——终极路由解决方案
还是先放官方的例子

"URL_ROUTE_RULES"=>array(
"test"        =>         function(){
         echo "just test";
    },
"hello/:name" =>         function($name){
         echo "Hello,".$name;
    })

这是第一个,这样访问的时候你访问xxx/hellow/hainuo会发现浏览器只输出了 Hello,hainuo别的什么都没有

"/^new/(d{4})/(d{2})$/" =>     function($year,$month){
     echo "year=".$year."&month=".$month;
}

这个例子也没有什么好说的,就是输出year=2015&month=6
这都不是我们需要的,难道闭包后就不能够继续运行后续的程序吗?
答案是肯定的,一定能支持后续程序运行的。
仔细看官方的示例还会发现,竟然有下面一个支持——我们的终极路由解决方案,超级为静态模式终于跟大家见面了,

"hello/:name" =>     function($name){
    echo "Hello,".$name."
"; $_SERVER["PATH_INFO"] = "blog/read/name/".$name; return false; } 假设blog控制器中的read操作方法代码如下: public function read($name){ echo "read,".$name."!
"; }

于是我们就顺利的找到了答案

 "URL_ROUTE_RULES"=>array(
    "/get(w+)[^/]"=>function(){
        $_SERVER["PATH_INFO"] = "blog/read/name/".$name;
        return false;     
    }

只需要在路由规则中如下填写,便ok了,这样设置后就会出现一个问题使用U方法得到URI将不再是我们所需要的,所以,在有关URI的地方请直接按照上面我们需要的规则填写。

  

备注一下:20140609
在闭包支持中,你使用IS_AJAX 会发现他始终为true 不清楚什么原因。这个留待以后研究吧

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/35726.html

相关文章

  • thinkphp源码分析(一)—开门篇

    摘要:源码分析开门篇生命周期入口文件用户发起的请求都会经过应用的入口文件,通常是文件。注册错误和异常机制执行注册错误和异常处理机制。由三部分组成应用关闭方法错误处理方法异常处理方法注册应用关闭方法是为了便于拦截一些系统错误。 源码分析—开门篇 thinkphp生命周期 1、入口文件 用户发起的请求都会经过应用的入口文件,通常是 ==public/index.php==文件。当然,你也可以更改...

    flybywind 评论0 收藏0
  • ThinkPHP 5.x 远程代码getshell漏洞实战分析

    摘要:简介是一个免费开源的,快速简单的面向对象的轻量级开发框架,因为其易用性扩展性,已经成长为国内颇具影响力的应用开发框架漏洞解析漏洞引发的原因是框架对控制器名没有进行足够的检测,现拉取来进行测试请求路由系统解析为模块控制器方法参数列表跟踪到 ThinkPHP 简介 ThinkPHP 是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,因为其易用性、扩展性,已经成长为国内颇具影响力...

    mykurisu 评论0 收藏0
  • daily-question-02(前端每日一题02)

    摘要:静态作用域与动态作用域静态作用域函数的作用域基于函数创建的位置。采用的是词法作用域,也称为静态作用域。可以劫持整个对象,并返回一个新的对象。防误触延缓执行立即执行节流所谓节流,就是指连续触发事件但是在秒中只执行一次函数。 在这里记录着每天自己遇到的一道印象深刻的前端问题,以及一道生活中随处可见的小问题。 强迫自己形成积累的习惯,鞭挞自己不断前行,共同学习。 Github 地址 2019...

    lk20150415 评论0 收藏0
  • daily-question-02(前端每日一题02)

    摘要:静态作用域与动态作用域静态作用域函数的作用域基于函数创建的位置。采用的是词法作用域,也称为静态作用域。可以劫持整个对象,并返回一个新的对象。防误触延缓执行立即执行节流所谓节流,就是指连续触发事件但是在秒中只执行一次函数。 在这里记录着每天自己遇到的一道印象深刻的前端问题,以及一道生活中随处可见的小问题。 强迫自己形成积累的习惯,鞭挞自己不断前行,共同学习。 Github 地址 2019...

    30e8336b8229 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<