路由這部分貌似在實際工作中沒有怎么設計過,只是在用默認的設置,在手冊里面看到部分,艱澀難懂。
1.路由定義
要使用路由功能需要支持PATH_INFO,PATH_INFO是什么呢?手冊中提到“要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情況下不支持路由功能),” , url支持path_info,不是apache要支持path_info么,度娘講的還算清楚一點,見下文:
pathinfo
(PHP 4 >= 4.0.3, PHP 5)
pathinfo -- 返回文件路徑的信息
說明
array pathinfo ( string path [, int options] )
pathinfo() 返回一個關聯數組包含有 path 的信息。包括以下的數組單元:dirname,basename 和 extension。
可以通過參數 options 指定要返回哪些單元。它們包括:PATHINFO_DIRNAME,PATHINFO_BASENAME 和 PATHINFO_EXTENSION。默認是返回全部的單元。
例子 1. pathinfo() 例子
<?php
$path_parts = pathinfo("/www/htdocs/index.html");
echo $path_parts["dirname"] . "\n";
echo $path_parts["basename"] . "\n";
echo $path_parts["extension"] . "\n";
?>
上例將輸出:
/www/htdocs
index.html
html
我去寫這段的時候在我的機器上沒有輸出任何內容,后來我在php安裝目錄下找到php.ini開啟了cgi.fix_pathinfo=1,然后確實能夠輸出上面的內容。
但是這只是講了一個函數的用法,就是pathinfo這個函數會返回一個數組,里面有三個元素分別是
dirname:我的理解,服務器名稱加上路徑,
basename:訪問的文件名,
extension:文件的擴展名
服務器支持后還需要在配置文件中打開相應的配置,
// 開啟路由 'URL_ROUTER_ON' => true,
這個配置在ThinkPHP\Conf\convention.php文件中也有定義,不過可以在模塊的配置文件中覆蓋它。然后就是定義路由規則了,路由的匹配是按照先到先得的順序來進行的,在第一次匹配成功之后就不會再次匹配了,而是訪問這個路由中的控制器和方法,並傳入參數,得到結果。
路由規則定義的格式是:'路由表達式'=>'路由地址和傳入參數' 或 array('路由表達式','路由地址','傳入參數')
路由表達式包含規則路由和正則路由
表達式 示例
正則表達式 /^blog\/(\d+)$/
規則表達式 blog/:id
路由地址表示當前路由表達式需要路由到的地址,包含內部地址和外部地址,並允許隱式傳入url里面沒有的參數,允許使用字符串或者數組的方式定義,特殊情況下可采用閉包函數定義路由功能,支持下面6中方式定義,
定義方式 | 定義格式 |
---|---|
方式1:路由到內部地址(字符串) | '[分組/模塊/操作]?額外參數1=值1&額外參數2=值2...' |
方式2:路由到內部地址(數組)參數采用字符串方式 | array('[分組/模塊/操作]','額外參數1=值1&額外參數2=值2...') |
方式3:路由到內部地址(數組)參數采用數組方式 | array('[分組/模塊/操作]',array('額外參數1'=>'值1','額外參數2'=>'值2'...)[,路由參數]) |
方式4:路由到外部地址(字符串)301重定向 | '外部地址' |
方式5:路由到外部地址(數組)可以指定重定向代碼 | array('外部地址','重定向代碼'[,路由參數]) |
方式6:閉包函數 | function($name){ echo 'Hello,'.$name;} |
完全不懂啊!內部地址,外部地址?什么概念呢局域網中的地址嗎?192.168.0.1這樣的?大學學的都忘記了,百度了一下,貌似這樣的,有三類內部地址,用來連接局域網中的設備,包含打印機等?
路由以http或者/開頭的話會被認為是一個外部地址或者重定向地址,例如
'blog/:id'=>'/blog/read/id/:1' 采用301重定向的方式路由跳轉,這種方式的好處是url可以比較隨意,包括在url里面傳入更多的非標准格式參數,擦完全不懂的,非標准格式參數為何物?太tm專業了。
'blog/:id'=>'blog/read':只支持模塊和操作地址,例如我們希望avatar/123重定向到
/member/avatar/id/123_small只能使用'avatar/:id'=>'/member/avatar/id/:1_small' 貌似:id代表一個參數,參數名字是id。路由地址采用重定向地址的話,如果要引用動態變量,也是采用
:1、:2
的方式。采用重定向到外部地址通常對網站改版后的URL遷移過程非常有用,例如:'blog/:id'=>'http://blog.thinkphp.cn/read/:1' 表示當前網站(可能是http://thinkphp.cn)的 blog/123
地址會直接重定向到 http://blog.thinkphp.cn/read/123
。
2.規則路由
規則表達式包含靜態地址和動態地址,或者是兩種地址的結合,如下:
"my" => "Member/myinfo", //靜態路由地址
"blog/:id" => "blog/read", //靜態地址和動態地址結合,
"new/:year/:month/:day" => "news/read", //靜態地址和動態地址的結合
":user/:blog_id" => "Blog/read", //全動態地址
參數里面以“:”開頭的就是動態參數,自動對應一個get參數,例如":id"表示此處可以使用$_GET['id']來獲取參數,而":year",":month",":day"分別對應$_GET['year'],$_GET['month'],$_GET['day']來獲取。
數字約束:支持對變量類型檢測,目前僅僅支持對數字類型的約束定義,例如'blog/:id\d'=>'blog/read',表示只匹配數字參數,
函數支持:可以支持對路由變量的函數過濾,例如'blog/:id\d|md5' => 'blog/read',表示對匹配到的變量進行md5處理,實際傳入read操作方法的$_GET['id'],其實是md5($_GET['id']),不支持對變量使用多次函數處理和函數額外參數處理。