PHP開發架構Yii Framework教程(5) URL管理

來源:互聯網
上載者:User

在上一篇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/<g:\w>'=>'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:ParamPattern>

ParamName表示GET參數名字,可選 項ParamPattern表示將用於匹配GET參數值的Regex。當產生一個網址(URL)時,這些參數令牌將被相應的參數值替換;當 解析一個網址時,相應的GET參數將通過解析結果來產生。

我們使用一些例子來解釋網址工作規則。我們假設我們的規則 包括如下三個:

array(    'posts'=>'post/list',    'post/<id:\d+>'=>'post/read',    'post/<year:\d{4}>/<title>'=>'post/read',)

調用$this->createUrl('post/list')產生/index.php/posts。第一個規則適用。    調用$this->createUrl('post/read',array('id'=>100))產生/index.php/post/100。 第二個規則適用。    調用$this->createUrl('post/read',array ('year'=>2008,'title'=>'a sample post'))產生/index.php/post/2008/a%20sample%20post 。第三個規則適用。    調用$this->createUrl('post/read')產生/index.php/post/read。請注意,沒有規則適用。

總之,當使用createUrl產生網址,路線和傳遞給該方法的GET參數被用來決定哪些網址規則適用。如果關聯規則中的每 個參數可以在GET參數找到的,將被傳遞給createUrl ,如果路線的規則也匹配路線參數,規則將用來產生網址。

如果GET參數傳遞到createUrl是以上所要求的一項規則,其他參數將出現在查詢字串。例如,如果我們調用$this- >createUrl('post/read',array('id'=>100,'year'=>2008)) ,我們將獲 得/index.php/post/100?year=2008。為了使這些額外參數出現在路徑資訊的一部分,我們應該給規則附加/*。 因此,該規則 post/<id:\d+>/* ,我們可以擷取網址/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 ]嘗試使用每個規則 來匹配它,直到某個規則可以適用。因此,高流量網站應用程式應盡量減少其使用的URL規則。

來看下Hangman中使用的規則 ‘game/guess/<g:\w>’=>’game/guess’,

也就是將所有類似 /game/guess/xx 全部映射到game/guess 也就是GameController 的 actionGuess 方法,傳入GET參數以 g=’x’ 的方式。參照每個字母的連結

CHtml::linkButton(chr($i),array('submit'=>array('guess','g'=>chr($i))));

點擊的字母連結為 /game/guess/?g=x 或 /game/guess/x 根據main.php 定義的 urlManager的匹配規則Yii架構調用GameController 的 actionGuess 方法,傳入GET參數。這樣在actionGuess 就可以通過 $_GET['g']來訪問這個參數的值。

// check to see if the letter is guessed correctly     if(isset($_GET['g'][0]) && ($result=$this->guess($_GET['g'][0]))!==null)         $this->render($result ? 'win' : 'lose');     else // the letter is guessed correctly, but not win yet     {         $guessed=$this->getPageState('guessed',array());         $guessed[$_GET['g'][0]]=true;         $this->setPageState('guessed',$guessed,array());         $this->render('guess');     }

使用urlManager 也允許自訂規則,或者隱藏 index.php ,具體可以參考Yii開發文檔: http://www.yiiframework.com/doc/guide/1.1/zh_cn/topics.url

查看全套教程:http://www.bianceng.cn/webkf/PHP/201301/35265.htm

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.