路由
利用路由功能,可以讓你的URL地址更加簡(jiǎn)潔和優(yōu)雅。ThinkPHP支持對(duì)模塊的URL地址進(jìn)行路由操作(路由功能是針對(duì)PATHINFO模式或者兼容URL而設(shè)計(jì)的,暫時(shí)不支持普通URL模式)。
路由功能可以針對(duì)模塊,也可以針對(duì)全局,針對(duì)模塊的路由則需要在模塊配置文件中開啟和設(shè)置路由,如果是針對(duì)全局的路由,則是在公共模塊的配置文件中開啟和設(shè)置
模塊路由和全局路由配置的區(qū)別在于,全局路由的路由地址必須包含模塊。
啟用路由
啟用路由
'URL_ROUTER_ON' => true,
路由規(guī)則配置:
模塊的配置文件中使用**URL_ROUTE_RULES**參數(shù)進(jìn)行配置,配置格式是一個(gè)數(shù)組,每個(gè)元素都代表一個(gè)路由規(guī)則
'URL_ROUTE_RULES'=>array(
'news/:year/:month/:day' => array('News/archive', 'status=1'),
'news/:id' => 'News/read',
'news/read/:id' => '/news/:1',
),
路由的定義
'路由表達(dá)式'=>'路由地址'或者:array('路由表達(dá)式','路由地址','傳入?yún)?shù)')
路由表達(dá)式包括規(guī)則路由和正則路由的定義表達(dá)式,只能使用字符串。
-
規(guī)則路由表達(dá)式
規(guī)則表達(dá)式通常包含靜態(tài)地址和動(dòng)態(tài)地址,或者兩種地址的結(jié)合。
'my' => 'Member/myinfo', // 靜態(tài)地址路由
'blog/:id' => 'Blog/read', // 靜態(tài)地址和動(dòng)態(tài)地址結(jié)合
'new/:year/:month/:day'=>'News/read', // 靜態(tài)地址和動(dòng)態(tài)地址結(jié)合'
:user/:blog_id' =>'Blog/read',// 全動(dòng)態(tài)地址
數(shù)字約束
支持對(duì)變量的類型檢測(cè),但僅僅支持?jǐn)?shù)字類型的約束定義,例如
'blog/:id\d'=>'Blog/read',
函數(shù)支持
可以支持對(duì)路由變量的函數(shù)過濾,例如:'blog/:id\d|md5'=>'Blog/read',
表示對(duì)匹配到的id變量進(jìn)行md5處理,也就是說(shuō),實(shí)際傳入read操作方法的$_GET['id']
其實(shí)是md5($_GET['id'])。
可選定義
支持對(duì)路由參數(shù)的可選定義,例如:
'blog/:year\d/[:month\d]'=>'Blog/archive',
[:month\d]
變量用[ ]包含起來(lái)后就表示該變量是路由匹配的可選變量。
完全匹配
規(guī)則匹配檢測(cè)的時(shí)候只是對(duì)URL從頭開始匹配,只要URL地址包含了定義的路由規(guī)則就會(huì)匹配成功,如果希望完全匹配,可以使用$符號(hào),例如:
'new/:cate$'=> 'News/category'
-
正則路由表達(dá)式
正則定義必須以“/”開頭,否則就視為規(guī)則表達(dá)式。
'/^new\/(\d{4})\/(\d{2})$/' => 'News/achive?year=:1&month=:2',
正則定義也支持函數(shù)過濾處理,例如:
'/^new\/(\d{4})\/(\d{2})$/' => 'News/achive?year=:1|format_year&month=:2',
其中 year=:1|format_year 就表示對(duì)匹配到的變量進(jìn)行format_year函數(shù)處理(假設(shè)format_year是一個(gè)用戶自定義函數(shù))。
靜態(tài)路由
靜態(tài)路由定義中不包含動(dòng)態(tài)參數(shù),靜態(tài)路由不需要遍歷路由規(guī)則而是直接定位,因此效率較高,但作用也有限。
靜態(tài)路由的路由地址 只支持字符串,格式:[控制器/操作?]參數(shù)1=值1&參數(shù)2=值2。
'URL_MAP_RULES'=>array( 'new/top' => 'news/index?type=top')
閉包支持
'URL_ROUTE_RULES'=>array( 'hello/:name' => function($name){ echo 'Hello,'.$name; })
繼續(xù)執(zhí)行
默認(rèn)的情況下,使用閉包定義路由的話,一旦匹配到路由規(guī)則,執(zhí)行完閉包方法之后,就會(huì)中止后續(xù)執(zhí)行。如果希望閉包函數(shù)執(zhí)行后,后續(xù)的程序繼續(xù)執(zhí)行,可以在閉包函數(shù)中使用布爾類型的返回值,例如:
'hello/:name' => function($name){
echo 'Hello,'.$name.'<br/>';
$_SERVER['PATH_INFO'] = 'blog/read/name/'.$name;
return false; } //返回false則可繼續(xù)執(zhí)行 blog控制器中的read方法
路由地址
路由地址(可以支持傳入額外參數(shù))表示前面的路由表達(dá)式需要路由到的地址(包括內(nèi)部地址和外部地址),并且允許隱式傳入U(xiǎn)RL里面沒有的一些參數(shù),這里允許使用字符串或者數(shù)組方式定義,特殊情況下還可以采用閉包函數(shù)定義路由功能。
支持下面6種方式定義:
定義方式 定義格式
方式1:路由到內(nèi)部地址(字符串) '[控制器/操作]?額外參數(shù)1=值1&額外參數(shù)2=值2...'
方式2:路由到內(nèi)部地址(數(shù)組)參數(shù)采用字符串方式 array('[控制器/操作]','額外參數(shù)1=值1&額外參數(shù)2=值2...')
方式3:路由到內(nèi)部地址(數(shù)組)參數(shù)采用數(shù)組方式 array('[控制器/操作]',array('額外參數(shù)1'=>'值1','額外參數(shù)2'=>'值2'...)[,路由參數(shù)])
方式4:路由到外部地址(字符串)301重定向 '外部地址'
方式5:路由到外部地址(數(shù)組)可以指定重定向代碼 array('外部地址','重定向代碼'[,路由參數(shù)])
方式6:閉包函數(shù) function($name){ echo 'Hello,'.$name;}
路由地址參數(shù)
路由參數(shù)
當(dāng)路由地址采用數(shù)組方式定義的時(shí)候,還可以傳入額外的路由參數(shù)。
這些參數(shù)的作用是限制前面定義的路由規(guī)則的生效條件。
限制URL后綴
例如:
'blog/:id'=>array('blog/read','status=1&app_id=5',array('ext'=>'html')),
就可以限制html后綴訪問該路由規(guī)則才能生效。
限制請(qǐng)求類型
例如:
'blog/:id'=>array('blog/read','status=1&app_id=5',array('method'=>'get')),
就限制了只有GET請(qǐng)求該路由規(guī)則才能生效。
自定義檢測(cè)
支持自定義檢測(cè),例如: 例如:
'blog/:id'=>array('blog/read','status=1&app_id=5',array('callback'=>'checkFun')),
就可以自定義checkFun函數(shù)來(lái)檢測(cè)是否生效,如果函數(shù)返回false則表示不生效。