在上一篇Yii Framework 開發簡明教程(4) Hangman 猜單字遊戲實例略去了幾個方面的問題,一是設定檔main.php 的URLManager,二是Controller的基類CComponent ,三是定義View使用的CHtml幫助類別。本篇戰開介紹URLManager,URL管理。
return array( ... 'components'=>array( 'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( 'game/guess/'=>'game/guess', ), ), ), );
Web應用程式完整的URL管理包括兩個面向。首先, 當使用者請求約定的URL,應用程式需要解析它變成可以理解的參數。第二 ,應用程式需求提供創造URL的方法,以便創建的URL應用程式可以理解的。對於Yii應用程序,這些透過CUrlManager輔助完成。
當用path格式URL,我們可以指定某些URL規則使我們的網址更用戶友好性。例如,我們可以產生一個短短的URL/post/100 ,而不是冗長/index.php/post/read/id/100。網址建立和解析都是透過CUrlManager指定網址規則。
要指 定的URL規則,我們必須設定urlManager 應用元件的屬性rules:
array( ...... 'components'=>array( ...... 'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( 'pattern1'=>'route1', 'pattern2'=>'route2', 'pattern3'=>'route3', ), ), ), );
這些規則以一系列的路線格式對數組指定,每對對應於一個單一的規則。路線(route)的格式必須是有效的正規表 達式,沒有分隔符號和修飾語。它是用於匹配網址的路徑資訊部分。還有route應指向一個有效的路線控制器。
規則可以綁定少量的GET參數。參數的一般格式如下:
ParamName表示GET參數名字,可選項ParamPattern表示將用於匹配GET參數值的正規表示式。當產生一個網址(URL)時,這些參數令牌將會被對應的參數值取代;當 解析一個網址時,對應的GET參數將會透過解析結果來產生。
我們使用一些範例來解釋網址工作規則。我們假設我們的規則包括以下三個:
array( 'posts'=>'post/list', 'post/'=>'post/read', 'post//
總之,當使用createUrl產生網址,路線和傳遞給該方法的GET參數被用來決定哪些網址規則適用。如果關聯規則中的每 個參數可以在GET參數找到的,將傳遞給createUrl ,如果路線的規則也符合路線參數,則規則將用來產生網址。
如果GET參數傳遞到createUrl是以上所要求的一項規則,其他參數將出現在查詢字串。例如,如果我們呼叫$this- >createUrl('post/read',array('id'=>100,'year'=>2008)) ,我們將獲得/index.php/post/100?year=2008 。為了使這些額外參數出現在路徑資訊的一部分,我們應該給規則附加/*。 因此,該規則 post//* ,我們可以取得網址/index.php/post/100/year/2008 。
正如我們所提到的,URL規則的其他用途是解析請求網址。當然,這是URL生成的一個逆過程。例如, 當使用者請 求/index.php/post/100 ,上面範例的第二個規則將適用來解析路線post/read和GET參數array('id'=>100) (可通 過$_GET 取得) 。
createurl方法所產生的是一個相對位址。為了得到一個絕對的url ,我們可以用前綴yii">
註:使用的URL規則將降低應用的效能。這是因為當解析請求的URL ,[ CUrlManager ]嘗試使用每個規則來匹配它,直到某個規則可以適用。所有類似/game/guess/xx 全部映射到game/guess 也就是GameController 的actionGuess 方法,傳入GET參數以g='x' 的方式。 /guess/?g=x 或/game/guess/x 根據main.php 定義的urlManager的匹配規則Yii框架呼叫GameController 的actionGuess 方法,傳入GET參數。來存取這個參數的值。