啓用路由
要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,採用普通URL模式的情況下不支持路由功能),並且在應用(或者模塊)配置文件中開啓路由:
'URL_ROUTER_ON' => true,
然後一般在模塊的配置文件中配置路由 數組的形式配置。
路由規則的定義格式爲: '路由表達式'=>'路由地址和傳入參數'
或者:array('路由表達式','路由地址','傳入參數')
3.0版本的路由支持做了增強,包含規則路由和正則路由支持。
一、規則路由
規則路由是由2.1版本的簡單路由進化而來,定義格式爲:
格式1:'路由規則'=>'[分組/模塊/操作]?額外參數1=值1&額外參數2=值2...'
格式2:'路由規則'=>array('[分組/模塊/操作]','額外參數1=值1&額外參數2=值2...')
格式3:'路由規則'=>'外部地址'
格式4:'路由規則'=>array('外部地址','重定向代碼')
注意事項:
-
路由規則中如果以“:”開頭,表示動態變量,否則爲靜態地址
-
格式2的額外參數可以傳入數組或者字符串
-
外部地址中如果要引用動態變量, 採用 :1、:2 的方式
-
路由規則支持變量的數字約束定義,例如:'news/:id\d'=>'News/read'
-
規則路由可以支持 全動態和動靜結合定義,例如':user/blog/:id'=>'Home/Blog/user'
-
路由規則非數字變量支持排除,例如 'news/:cate^add|edit|delete'=>'News/category'
-
路由規則中的靜態地址部分不區分大小寫
-
'URL_ROUTER_ON' => true, //開啓路由
-
'URL_ROUTE_RULES' => array( //定義路由規則
-
'news/:year/:month/:day' => array('News/archive', 'status=1'),
-
'news/:id' => 'News/read',
-
'news/read/:id' => '/news/:1',
-
),
http://serverName/index.php/news/8
http://serverName/index.php/news/10
則會會匹配到第二條規則路由,並解析到News模塊的read操作,而且後面的數字會傳入$_GET['id']變量。
如果我們訪問下面的URL
http://serverName/index.php/news/2012/01/08
http://serverName/index.php/news/2012/01/15
則會匹配到第一條規則路由,並解析到News模塊的archive操作,而且會傳入year、month和day的GET變量。
第二條路由規則還可以改成
'news/:year/:month/:day/'=>'News/archive?status=1',
通常情況下,需要傳入數組參數的時候纔會需要使用格式數組來定義
第三條路由規則是一個路由重定向,一般是用於網站改版後的URL遷移,如果之前的URL訪問規則是
http://serverName/index.php/news/read/8
那麼會重定向到新的內部路由規則
http://serverName/index.php/news/8
這裏之所以用了重定向路由是爲了告訴搜索引擎這些地址已經發生改變了 而且以後是不需要保留。
有些情況下,可能會存在衝突,假如要支持通過標識來訪問文章,
http://serverName/index.php/news/hello_world
那麼解析規則就會混淆,但是我們可以更改路由規則如下:
-
'URL_ROUTER_ON' => true, //開啓路由
-
'URL_ROUTE_RULES' => array( //定義路由規則
-
'news/:year/:month/:day' => array('News/archive', 'status=1'),
-
'news/:id\d' => 'News/read',
-
'news/:name' => 'News/read',
-
'news/read/:id' => '/news/:1',
-
),
而 news/:name 規則定義 則會匹配所有的字符情況,這也是默認的情況,目前規則路由只區分數字和所有字符的情況,如果需要嚴格的類型約束,請採用正則路由定義規則。
-
class CityAction extends Action{
-
public function city(){
-
//讀取城市名
-
$cityName = $_GET['name'];
-
echo '當前城市' . $cityName;
-
}
-
}
-
'city/:name' =>'City/city'
接下來,我們就可以在瀏覽器裏面輸入
http://serverName/index.php/City/beijing/
http://serverName/index.php/City/shanghai/
http://serverName/index.php/City/shenzhen/
會看到依次輸出的結果是:
當前城市:beijing
當前城市:shanghai
當前城市:Shenzhen
-
'URL_ROUTER_ON' => true, //開啓路由
-
'URL_ROUTE_RULES' => array( //定義路由規則
-
':user/bolg/:id' => 'Blog/read',
-
':user/:blog_name' => 'Blog/read',
-
),
http://serverName/index.php/user1/blog/25/
http://serverName/index.php/username2/blog/245/
並解析到Blog模塊的read操作方法 ,傳入user和id兩個GET參數。
第二條路由會匹配到下面的URL訪問
http://serverName/index.php/user1/hello_world
http://serverName/index.php/username2/test_nme
同樣解析到Blog模塊的read操作方法,只是傳入的參數變成blog_name 一個GET參數。
正則路由可以實現更加複雜的路由定義,支持的定義格式如下:
格式1:'路由正則'=>'[分組/模塊/操作]?參數1=值1&參數2=值2...'
格式2:'路由正則'=>array('[分組/模塊/操作]','參數1=值1&參數2=值2...') 格式3:'路由正則'=>'外部地址'
格式4:'路由正則'=>array('外部地址','重定向代碼')
注意事項:
-
正則路由規則必須以“/”開始和結束
-
格式2的參數可以傳入數組或者字符串
-
參數值和外部地址中可以用動態變量 採用 :1、 :2 的方式
-
'URL_ROUTER_ON' => true, //開啓路由
-
'URL_ROUTE_RULES' => array( //定義路由規則
-
'/^blog\/(\d+)$/' => 'Blog/read?id=:1',
-
'/^blog\/(\d+)\/(\d+)$/' => 'Blog/achive?year=:1&month=:2',
-
'/^blog\/(\d+)_(\d+)$/' => 'blog.php?id=:1&page=:2',
-
),