理組件主要提供2個功能:
1、根據用戶輸入的url,解析出處理這個請求的路由——由哪個Controller的哪個Action來處理,同時將url中的部分參數添加到$_GET參數中。在每個web框架中都需要一個這樣的組件來進行路由分發的工作。
2、根據路由和參數數組創建出url。在視圖層可以對url進行硬編碼,即直接寫死url地址,但是這往往缺乏靈活性,為后期的維護帶來成本。
array(
'components'=>array(
'urlFormat'=>'path',
'rules'=>array(
'/art/<cate:\w+>/<key:\d+>/<id:\d+>/<p:\d+>'=>'article/<cate>/<key>',
'post/<id:\d+>/<title:.*?>'=>'post/view',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
);
如上是一個url管理組件的配置,一共有3條規則。下圖以第一條規則為例,說明了url解析和url創建的2個功能。對於每個路由規 則,CUrlManager都會創建一個CUrlRule對象來處理這條規則對應的這個2個功能,所以說有一條規則就會有幾個CUrlRule對象。所以 CUrlRule才是url管理的核心所在,接下來分析CUrlRule的工作原理。
每條url路由規則由一個CUrlRule對象來進行處理,接下來以如下路由規則為例:'/art/<cate:\w+>/<key: \d+>/<id:\d+>/<p:\d+>'=>'article/<cate>/<key& gt;',說明url解析和url創建的處理過程。每個CUrlRule對象處理url的過程可以分為3個階段:
1、 初始化CUrlRule對象
在CUrlRule對象的構造函數中,會初始化6個重要的成員變量:

2、 解析url
解析url的工作分3步走:a、根據pattern規則,解析出url中的各個字段;b、根據references對路由中的引用字段進行替換;c、將params中指定的字段添加到$_GET數組中
3、 創建url
創建url的工作分3步走:a、根據routePattern規則,解析出輸入的路由中各個字段;b、將輸入的參數數組和上一步解析的數組進行合並;c、用合並后的數組對template進行替換
