Thinkphp 終極路由解決方案(超級偽靜態)閉包的爽快使用

發表於2019-05-11

這篇文章在segmentfault和thinkphp.cn上都發過,在這裡再次貼出此文僅僅是為了能夠將文章分享過來,畢竟我自己能夠拿得出手的文章還是比較少的,大家不要吐槽啊。

在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.'<br/>';
        $_SERVER['PATH_INFO'] = 'blog/read/name/'.$name;
        return false;
    }


    假設blog控制器中的read操作方法程式碼如下:

    public function read($name){
        echo 'read,'.$name.'!<br/>';
    }


於是我們就順利的找到了答案

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


只需要在路由規則中如下填寫,便ok了,這樣設定後就會出現一個問題使用U方法得到URI將不再是我們所需要的,所以,在有關URI的地方請直接按照上面我們需要的規則填寫。
備註一下:20140609
在閉包支援中,你使用IS_AJAX 會發現他始終為true  不清楚什麼原因。這個留待以後研究吧
評論(0)

相關文章