Yii2之Url類全面解密 有你不知道的~

Url

之前開發項目的時候,咱們習慣於把網站網址作一個配置參數保存,善於用yii2的Url各類方法,無形中讓你的代碼更簡單、更靈活、更規範。
下面就一一說明一下。php

Url::base($scheme = false)

base函數返回當前請求的基地址,它有一個參數$scheme,默認爲false,表明返回地址不包含主機信息。
$scheme參數說明git

  • false 返回地址不包含主機信息github

  • true 包含主機地址web

  • http 返回http協議的主機地址yii2

  • https 返回https協議的主機地址session

  • '' 返回相對的主機地址yii

咱們以http://yii2-study.local.com/i... 來舉例函數

Url::base();
    //  返回爲''
    Url::base(true)
    //  返回爲http://yii2-study.local.com
    //  記住:最後沒有反斜槓哦
    Url::base('http');
    //  返回爲http://yii2-study.local.com
    Url::base('https');
    //  返回爲https://yii2-study.local.com
    Url::base('');
    //  返回爲//yii2-study.local.com

切記:http https ''這些參數,函數base並無去判斷,只是簡單的字符串替換,若是你輸入了base('d'),則返回網站

d://yii2-study.local.comurl

Url::canonical()

返回當前請求的標準url
咱們仍是以http://yii2-study.local.com/i... 來舉例

echo Url::canonical();
    //  返回結果爲 http://yii2-study.local.com/index.php?r=site/index

Url::current(array $params = [], $scheme = false)

返回當前請求+GET參數,重點是該函數配合參數還能增長刪除GET參數,這在咱們某些url匹配時候會變得很是有用。
咱們以http://yii2-study.local.com/i... 來舉例

echo Url::current();

執行上述代碼後咱們會獲得 /index.php?r=site/index&id=78&cat=me 這樣的結果

請注意,current()和canonical()區別,若是對本例裏的url執行canonical()函數,會獲得http://yii2-study.local.com/i... ,相比較current,它多了主機信息,少了GET參數(路由請求除外)。

上面是current獲取當前的Url,咱們還可使用current對請求進行修改和刪除等操做。

例子1:咱們對當前請求增長一個name=abei GET參數,只須要執行

echo Url::current(['name'=>'abei']);

因而咱們得到了預想的結果/index.php?r=site/index&id=78&cat=me&name=abei

例子2:咱們要刪除例子url中的cat參數,只須要執行

echo Url::current(['cat'=>null]);

則結果爲/index.php?r=site/index&id=78 哈哈,cat參數被刪除了

千萬記住:刪除一個GET參數的時候,只能設置current對應參數值爲null,設置成false或''都是沒用的。

例子3:更新例子中url的cat參數爲you

echo Url::current(['cat'=>'you']);

是的,yii2很貼心的將將結果返回爲 /index.php?r=site/index&id=78&cat=you。感謝薛強,雖然如今在yii2的github已經看不到你的comment,仍然要感謝你創造了yii2.

一個大問題,current返回的結果中如何包含主機信息那?
你只需,只需將current的第二個參數設置爲true就ok了。

Url::to($url = '', $scheme = false) 和 Url::toRoute($route, $scheme = false)

生成一個URL,to()和toRoute()只有一個不一樣,那就是當to()的第一個函數爲一個字符串的時候,會直接返回,而toRoute會將其解析成controller/action或action,而後返回url。
下面咱們來舉幾個例子來講明下

Url::to(['site/about','cat'=>'abei']);
    Url::toRoute(['site/about','cat'=>'abei']);
    //  以上兩個函數輸出了同一個結果 index.php?r=site/about&cat=abei
    Url::to('site/index');
    Url::toRoute('site/index');
    //  以上兩個函數輸出結果不一樣 to()的結果爲site/index toRoute()的結果爲index.php?r=site/index
    Url::to();
    Url::toRoute();
    //  to()無參數時返回了當前的路由+GET,而toRoute報錯了(toRoute第一個參數不容許不存在)
    Url::to("@web/images/logo.gif");
    Url::toRoute("@web/images/logo.gif");
    //  to和toRoute均支持別名。
    Url::to(['site/index','#'=>'name');
    Url::toRoute(['site/index','#'=>'name')
    //  這裏有一個特殊的#,使用他能實現內部錨點,to和toRoute都可以生成index.php?r=site/index#name

固然,to和toRoute也有第二個參數,決定返回的url是否含有主機信息。

哥倆好~ Url::previous($name = null)和Url::remember($url = '', $name = null)

你是否有過這樣的需求,好比記錄一個會員最近30個訪問的路徑,使用previous和remember就能輕易實現,就和他們的名字同樣,用remember能夠存儲當前路徑,使用previous能夠把remember存起來的url展現出來。
來來來,貼代碼,其餘都沒有用。

Url::remember('http://www.a.com','a');
    Url::remember('http://www.b.com','b');
    var_dump(Url::previous('a'));
    //  結果輸出了http://www.a.com

yii2記住了,小提示,是session原理。

我想細心的你必定發現了,是的,previous和remember的參數是能夠爲空的,沒錯,阿北用代碼來講明。
咱們仍是以 http://yii2-study.local.com/i...爲例

echo Url::previous();
    //  當previous參數爲空時,返回returnUrl。
    echo Url::remember();
    //  對於remember函數,當第一個參數$url不提供,將記住當前路由請求(即http://yii2-study.local.com/index.php?r=site/index),第二個參數$name不提供,則默認爲yii\web\User::$returnUrlParam

其餘!

固然Url還有一些其餘函數,好比home()等,比較簡單,就不一一說明,主要上面幾個大方法掌握了,Url基本就過了。

相關文章
相關標籤/搜索