YII2框架表單-model(驗證)-HTML_help部件 URL_help部件 以註冊頁面爲實例

YII2框架中除了 controller和model十分重要之外,YII2框架中還提供了強大的視圖部件以及強大的表單驗證下面我們就以註冊頁面爲實例來一探究竟!!

效果圖:

1、首先我們要建立model層並且建立rules()方法 以及字段屬性

   我們看看model層中rules方法定義:

Rules驗證規則:

 required : 必須值驗證屬性||CRequiredValidator 的別名, 確保了特性不爲空.

[['字段名1','字段名2'],required]    //字段1 2 必填
 
[['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息'];
 email : 郵箱驗證||CEmailValidator 的別名,確保了特性的值是一個有效的電郵地址.

['email', 'email'];
 match : 正則驗證||CRegularExpressionValidator 的別名, 確保了特性匹配一個正則表達式.

[['字段名'],'match','pattern'=>'正則表達式','message'=>'提示信息'];      
[['字段名'],'match','not'=>ture,'pattern'=>'正則表達式','message'=>'提示信息'];  /*正則取反*/
 url : 網址||CUrlValidator 的別名, 確保了特性是一個有效的路徑.

['website', 'url', 'defaultScheme' => 'http'];
captcha(驗證碼)||CCaptchaValidator 的別名,確保了特性的值等於 CAPTCHA 顯示出來的驗證碼.

['verificationCode', 'captcha'];
safe : 安全

['description', 'safe'];
compare :(比較) CCompareValidator 的別名, 確保了特性的值等於另一個特性或常量.

['repassword', 'compare', 'compareAttribute' => 'password','message'=>'兩次輸入的密碼不一致!'],
 
//compareValue:比較常量值 operator:比較操作符 
['age', 'compare', 'compareValue' => 30, 'operator' => '>='];
 default : 默認值||CDefaultValueValidator 的別名, 爲特性指派了一個默認值.

['age', 'default', 'value' => null];
 exist : 存在||CExistValidator 的別名, 確保屬性值存在於指定的數據表字段中.

['字段名', 'exist'];
 file : 文件||CFileValidator 的別名, 確保了特性包含了一個上傳文件的名稱.

['primaryImage', 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 1024*1024*1024]
 filter : 濾鏡||CFilterValidator 的別名, 使用一個filter轉換屬性.

//'skipOnArray' => true 非必填
[['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true];
 in : 範圍||CRangeValidator 的別名, 確保了特性出現在一個預訂的值列表裏.

['level', 'in', 'range' => [1, 2, 3]];
 unique : 唯一性||CUniqueValidator 的別名, 確保了特性在數據表字段中是唯一的.

['字段名', 'unique']
 補充:聯合唯一索引rule規則

[
    ['app_id', 'group_id'], 
    'unique', 
    'targetAttribute' => ['app_id', 'group_id'], 
    'message' => 'app_id和group_id已經被佔用!'
],
 integer : 整數

['age', 'integer'];
 number : 數字

['salary', 'number'];
 double : 雙精度浮點型

['salary', 'double'];
 date : (日期)

[['from', 'to'], 'date'];
 string : 字符串

['username', 'string', 'length' => [4, 24]];
 boolean : 是否爲一個布爾值||CBooleanValidator 的別名

['字段名', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true];
 image :是否爲有效的圖片文件

[
    'primaryImage', 
    'image', 
    'extensions' => 'png, jpg',  
    'minWidth' => 100, 'maxWidth' => 1000,  'minHeight' => 100, 'maxHeight' => 1000
]
 each:遍歷,ids 和 product_ids 是數字的集合

[['ids', 'product_ids'], 'each', 'rule' => ['integer']],


自定義rules:

['password', 'validatePassword'],
 
/**
 * Validates the password.
 * This method serves as the inline validation for password.
 *
 * @param string $attribute the attribute currently being validated
 * @param array $params the additional name-value pairs given in the rule
 */
public function validatePassword($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUser();
        if (!$user || !$user->validatePassword($this->password)) {
            $this->addError($attribute, '賬號或者密碼錯誤!');
        }
    }
}


我們model層中的rules方法

/**
 * @inheritdoc
 */
public function rules()
{
    return [
        [['phone'], 'match','pattern'=>'/^1[0-9]{10}$/','message'=>'手機號格式不正確'],
        ['username','string','min'=>6,'max'=>18,'tooLong'=>'字符不能超過18個','tooShort'=>'至少6個字符'],
        [['username', 'password', 'email','phone'], 'required', 'message' => '不能爲空'],
        ['email','email','message'=>'請填入正確的郵箱'],
        ['password','string','min'=>6,'max'=>18,'tooLong'=>'字符不能超過18個','tooShort'=>'至少6個字符'],
    ];
}
設置字段屬性
public function attributeLabels()
{
    return [
        'id' => 'ID',
        'username' => 'Username',
        'password' => 'Password',
        'email' => 'Email',
        'phone' => 'Phone',
    ];
}

2、控制器調用model
<?php
namespace frontend\controllers;
header("content-type:text/html;charset=utf-8");
use Yii;
use yii\web\Controller;
use frontend\models\UserModel;
class RegisterController extends Controller
{
   public function actionIndex(){
        $model=new UserModel();
        return $this->render('index',['model'=>$model]);
   }
}

3、視圖層(重頭戲)
<?php
use yii\helpers\Url;
use yii\helpers\Html;
use yii\widgets\ActiveForm;
$this->title = '註冊';
$this->params['breadcrumbs'][] = $this->title;
?>
    <h1><?php echo  Html::encode($this->title)?></h1>
    <?php
    $form=ActiveForm::begin([
        'action'=>Url::toRoute('index'),
        'method'=>'post',
    ]);
    ?>
    <p><?php echo $form->field($model, 'username')->label('用戶名:',['style'=>['float'=>'left','margin-top'=>'10px']])->textInput(['style'=>['width'=>'300px','margin-left'=>'0px'],'placeholder'=>'請輸入6~18位字符']);?></p>

    <p><?php echo $form->field($model, 'password')->label('密  &nbsp;&nbsp;碼:',['style'=>['float'=>'left','margin-top'=>'10px']])->passwordInput(['style'=>['width'=>'300px','margin-left'=>'0px'],'placeholder'=>'請輸入6~18位英文字母、數字']);?></p>

    <p><?php echo $form->field($model,'email')->label('郵  &nbsp;&nbsp;箱:',['style'=>['float'=>'left','margin-top'=>'10px']])->textInput(['style'=>['width'=>'300px','margin-left'=>'0px'],'placeholder'=>'請輸入您的常用郵箱']);?></p>

<p><?php echo $form->field($model,'phone')->label('手機號:',['style'=>['float'=>'left','margin-top'=>'10px']])->textInput(['style'=>['width'=>'300px','margin-left'=>'0px'],'placeholder'=>'請輸入您的手機號']);?></p>

<p><?=Html::submitButton('註冊',['class'=>'btn btn-primary'])?></p>
<?php
    ActiveForm::end();
?>

Html 幫助類
任何一個 web 應用程序會生成很多 HTMl 超文本標記。如果超文本標記是靜態的,那麼將 PHP 和 HTML 混合在一個文件裏這種做法是非常高效的。但是,如果這些超文本標記是動態生成的,那麼如果沒有額外的輔助工具,這個過程將會變得複雜。Yii 通過 HTML 幫助類來提供生成超文本標記的方法。這個幫助類包含有一系列的用於處理通用的 HTML 標籤和其屬性以及內容的靜態方法。

注意:如果你的超文本標記接近靜態的,那麼最好是直接使用 HTML。沒有必要把所有的超文本標記都用 HTML 輔助類來生成。

基礎
由於通過字符串連接來生成動態的 HTML 會很容易變得凌亂,Yii 提供了一系列的靜態方法來操作標籤配置並基於這些配置來創建對應的標籤。

生成標籤
生成一個標籤的代碼類似如下:

<?= Html::tag('p', Html::encode($user->name), ['class' => 'username']) ?>
這個方法的第一個參數是標籤名稱。第二個是要裝入到開始和結束標籤間的內容。注意到我們使用 Html::encode 。那是因爲內容不會被自動的轉碼以允許在有需要的時候嵌套 HTML。第三個參數是一個 HTML 配置數組,或者換言之,標籤屬性。在這個數組中,數組的下標是屬性名稱,比如class,href 或者 target,而值則是對應屬性的值。

以上代碼會生成如下 HTML :

<p class="username">samdark</p>
如果你只需要開啓一個標籤或者關閉一個標籤,你可以使用 Html::beginTag() 和 Html::endTag() 方法。

標籤屬性( Options )在 Html 幫助類很多方法和大量的小部件中都有使用。在這些情況下,有一些額外的處理我們需要知道:

如果一個值爲 null ,那麼對應的屬性將不會被渲染。
如果是布爾類型的值的屬性,將會被當做 布爾屬性 來處理。
屬性的值將會用 yii\helpers\Html::encode() 方法進行 HTML 轉碼處理。
如果一個屬性的值是一個數組,那麼它將會被如下處理:

如果這個屬性是一個如 yii\helpers\Html::$dataAttributes 所列的數據屬性,比如 data 或者 ng,一系列的屬性列表將會被渲染,每個代表值數組中的元素。比如: 'data' => ['id' => 1, 'name' => 'yii'] 將會生成data-id="1" data-name="yii";'data' => ['params' => ['id' => 1, 'name' => 'yii'], 'status' => 'ok'] 生成data-params='{"id":1,"name":"yii"}' data-status="ok"。注意後者 中,一個子數組被輸出爲 JSON 。
如果這個屬性不是一個數據屬性,那麼值將會被 JSON-encoded。比如:['params' => ['id' => 1, 'name' => 'yii'] 生成params='{"id":1,"name":"yii"}'。
生成 CSS 類和樣式
當開始構造一個 HTML 標籤的屬性時,我們經常需要對默認的屬性進行修改。爲了添加或者刪除 CSS 類,你可以使用如下代碼:

$options = ['class' => 'btn btn-default'];
 
if ($type === 'success') {
    Html::removeCssClass($options, 'btn-default');
    Html::addCssClass($options, 'btn-success');
}
 
echo Html::tag('div', 'Pwede na', $options);
 
// in case of $type of 'success' it will render
// <div class="btn btn-success">Pwede na</div>
基於同樣的目的,針對 style 屬性:

$options = ['class' => ['btn', 'btn-default']];
 
echo Html::tag('div', 'Save', $options);
// renders '<div class="btn btn-default">Save</div>'
While adding or removing classes you may use the array format as well:

$options = ['class' => 'btn'];
 
if ($type === 'success') {
    Html::addCssClass($options, ['btn-success', 'btn-lg']);
}
 
echo Html::tag('div', 'Save', $options);
// renders '<div class="btn btn-success btn-lg">Save</div>'
Html::addCssClass() prevents duplicating classes, so you don't need to worry that the same class may appear twice:

$options = ['class' => 'btn btn-default'];
 
Html::addCssClass($options, 'btn-default'); // class 'btn-default' is already present
 
echo Html::tag('div', 'Save', $options);
// renders '<div class="btn btn-default">Save</div>'
If the CSS class option is specified via the array format, you may use a named key to mark the logical purpose of the class.In this case, a class with the same key in the array format will be ignored inHtml::addCssClass():

$options = [
    'class' => [
        'btn',
        'theme' => 'btn-default',
    ]
];
 
Html::addCssClass($options, ['theme' => 'btn-success']); // 'theme' key is already taken
 
echo Html::tag('div', 'Save', $options);
// renders '<div class="btn btn-default">Save</div>'
CSS styles can be setup in similar way using style attribute:

$options = ['style' => ['width' => '100px', 'height' => '100px']];
 
// gives style="width: 100px; height: 200px; position: absolute;"
Html::addCssStyle($options, 'height: 200px; position: absolute;');
 
// gives style="position: absolute;"
Html::removeCssStyle($options, ['width', 'height']);
當使用 yii\helpers\Html::addCssStyle() 方法時,你可以指定一個和 CSS 屬性相關的名值對的數組,也可以直接是一個類似 width: 100px; height: 200px; 的字符串。這些格式將會自動的被 yii\helpers\Html::cssStyleFromArray() 和yii\helpers\Html::cssStyleToArray() 方法進行轉換。方法 yii\helpers\Html::removeCssStyle() 接收一個包含要被移除的屬性數組作爲參數。如果只想移除一個屬性,你可以直接傳遞一個字符串。

標籤內容的轉碼和解碼
爲了讓內容能夠正確安全的顯示,一些 HTML 特殊字符應該被轉碼。在 PHP 中,這個操作由 htmlspecialchars 和htmlspecialchars_decode 完成。直接使用這些方法的問題是,你總是需要指定轉碼所需的額外標誌。由於標誌一般總是不變的,而內容轉碼的過程爲了避免一些安全問題,需要和應用的默認過程匹配,Yii 提供了兩個簡單可用的對 PHP 原生方法的封裝:

$userName = Html::encode($user->name);
echo $userName;
 
$decodedUserName = Html::decode($userName);
表單
處理表單標籤是大量的重複性勞動並且易錯。因此,Yii 也提供了一系列的方法來輔助處理表單標籤。

注意: 考慮在處理 models 以及需要驗證的情形下,使用 yii\widgets\ActiveForm 組件。

創建表單
表單可以用類似如下代碼,使用 yii\helpers\Html::beginForm() 方法開啓:

<?= Html::beginForm(['order/update', 'id' => $id], 'post', ['enctype' => 'multipart/form-data']) ?>
方法的第一個參數爲表單將要被提交的 URL 地址。它可以以 Yii 路由的形式被指定,並由 yii\helpers\Url::to() 來接收處理。第二個參數是使用的方法,默認爲post 方法。第三個參數爲表單標籤的屬性數組。在上面的例子中,我們把編碼 POST 請求中的表單數據的方式改爲 multipart/form-data。如果是上傳文件,這個調整是必須的。

關閉表單標籤非常簡單:

<?= Html::endForm() ?>
按鈕
你可以用如下代碼生成按鈕:

<?= Html::button('Press me!', ['class' => 'teaser']) ?>
<?= Html::submitButton('Submit', ['class' => 'submit']) ?>
<?= Html::resetButton('Reset', ['class' => 'reset']) ?>
上述三個方法的第一個參數爲按鈕的標題,第二個是標籤屬性。標題默認沒有進行轉碼,如果標題是由終端用輸入的,那麼請自行用 yii\helpers\Html::encode() 方法進行轉碼。

輸入欄
input 相關的方法有兩組:以 active 開頭的被稱爲 active inputs,另一組則不以其開頭。active inputs 依據指定的模型和屬性獲取數據,而普通 input 則是直接指定數據。

一般用法如下:

type, input name, input value, options
<?= Html::input('text', 'username', $user->name, ['class' => $username]) ?>
 
type, model, model attribute name, options
<?= Html::activeInput('text', $user, 'name', ['class' => $username]) ?>
如果你知道 input 類型,更方便的做法是使用以下快捷方法:

yii\helpers\Html::buttonInput()
yii\helpers\Html::submitInput()
yii\helpers\Html::resetInput()
yii\helpers\Html::textInput(), yii\helpers\Html::activeTextInput()
yii\helpers\Html::hiddenInput(), yii\helpers\Html::activeHiddenInput()
yii\helpers\Html::passwordInput() / yii\helpers\Html::activePasswordInput()
yii\helpers\Html::fileInput(), yii\helpers\Html::activeFileInput()
yii\helpers\Html::textarea(), yii\helpers\Html::activeTextarea()
Radios 和 checkboxes 在方法的聲明上有一點點不同:

<?= Html::radio('agree', true, ['label' => 'I agree']);
<?= Html::activeRadio($model, 'agree', ['class' => 'agreement'])
 
<?= Html::checkbox('agree', true, ['label' => 'I agree']);
<?= Html::activeCheckbox($model, 'agree', ['class' => 'agreement'])
Dropdown list 和 list box 將會如下渲染:

<?= Html::dropDownList('list', $currentUserId, ArrayHelper::map($userModels, 'id', 'name')) ?>
<?= Html::activeDropDownList($users, 'id', ArrayHelper::map($userModels, 'id', 'name')) ?>
 
<?= Html::listBox('list', $currentUserId, ArrayHelper::map($userModels, 'id', 'name')) ?>
<?= Html::activeListBox($users, 'id', ArrayHelper::map($userModels, 'id', 'name')) ?>
第一個參數是 input 的名稱,第二個是當前選中的值,第三個則是一個下標爲列表值,值爲列表標籤的名值對數組。

如果你需要使用多項選擇, checkbox list 應該能夠符合你的需求:

<?= Html::checkboxList('roles', [16, 42], ArrayHelper::map($roleModels, 'id', 'name')) ?>
<?= Html::activeCheckboxList($user, 'role', ArrayHelper::map($roleModels, 'id', 'name')) ?>
否則,用 radio list :

<?= Html::radioList('roles', [16, 42], ArrayHelper::map($roleModels, 'id', 'name')) ?>
<?= Html::activeRadioList($user, 'role', ArrayHelper::map($roleModels, 'id', 'name')) ?>
Labels 和 Errors
如同 inputs 一樣,Yii 也提供了兩個方法用於生成表單 label 。帶 ative 方法用於從 model 中取數據,另外一個則是直接接收數據。

<?= Html::label('User name', 'username', ['class' => 'label username']) ?>
<?= Html::activeLabel($user, 'username', ['class' => 'label username'])
爲了從一個或者一組 model 中顯示錶單的概要錯誤,你可以使用如下方法:

<?= Html::errorSummary($posts, ['class' => 'errors']) ?>
爲了顯示單個錯誤:

<?= Html::error($post, 'title', ['class' => 'error']) ?>
Input 的名和值
Yii 提供了方法用於從 model 中獲取 input 的名稱,ids,值。這些主要用於內部調用,但是有時候你也需要使用它們:

// Post[title]
echo Html::getInputName($post, 'title');
 
// post-title
echo Html::getInputId($post, 'title');
 
// my first post
echo Html::getAttributeValue($post, 'title');
 
// $post->authors[0]
echo Html::getAttributeValue($post, '[0]authors[0]');
在上面的例子中,第一個參數爲模型,而第二個參數是屬性表達式。在最簡單的表單中,這個屬性表達式就是屬性名稱,但是在一些多行輸入的時候,它也可以是屬性名以數組下標前綴或者後綴(也可能是同時)。

[0]content 代表多行輸入時第一個 model 的 content 屬性的數據值。
dates[0] 代表 dates 屬性的第一個數組元素。
[0]dates[0] 代表多行輸入時第一個 model 的 dates 屬性的第一個數組元素。
爲了獲取一個沒有前綴或者後綴的屬性名稱,我們可以如下做:

// dates
echo Html::getAttributeName('dates[0]');
樣式表和腳本
Yii 提供兩個方法用於生成包含內聯樣式和腳本代碼的標籤。

<?= Html::style('.danger { color: #f00; }') ?>
 
Gives you
 
<style>.danger { color: #f00; }</style>
 
 
<?= Html::script('alert("Hello!");', ['defer' => true]);
 
Gives you
 
<script defer>alert("Hello!");</script>
如果你想要外聯 css 樣式文件,可以如下做:

<?= Html::cssFile('@web/css/ie5.css', ['condition' => 'IE 5']) ?>
 
generates
 
<!--[if IE 5]>
    <link href="http://example.com/css/ie5.css" />
<![endif]-->
第一個參數是 URL。第二個參數是標籤屬性數組。比普通的標籤配置項額外多出的是,你可以指定:

condition 來讓 <link 被條件控制註釋包裹( IE hacker )。希望你在未來不再需要條件控制註釋。
noscript 可以被設置爲 true ,這樣 <link就會被 <noscript>包裹,如此那麼這段代碼只有在瀏覽器不支持 JavaScript 或者被用戶禁用的時候纔會被引入進來。
爲了外聯 JavaScript 文件:

<?= Html::jsFile('@web/js/main.js') ?>
這個方法的第一個參數同 CSS 一樣用於指定外聯鏈接。第二個參數是一個標籤屬性數組。同 cssFile 一樣,你可以指定 condtion 配置項。

超鏈接
有一個方法可以用於便捷的生成超鏈接:

<?= Html::a('Profile', ['user/view', 'id' => $id], ['class' => 'profile-link']) ?>
第一個參數是超鏈接的標題。它不會被轉碼,所以如果是用戶輸入數據,你需要使用 Html::encode() 方法進行轉碼。第二個參數是<a 標籤的 href 屬性的值。關於該參數能夠接受的更詳細的數據值,請參閱 Url::to()。第三個參數是標籤的屬性數組。

在需要的時候,你可以用如下代碼生成 mailto 鏈接:

<?= Html::mailto('Contact us', '[email protected]') ?>
圖片
爲了生成圖片標籤,你可以如下做:

<?= Html::img('@web/images/logo.png', ['alt' => 'My logo']) ?>
 
generates
 
<img src="/docs/guide/2.0/http://example.com/images/logo.png" alt="My logo" />
除了 aliases 之外,第一個參數可以接受 路由,查詢,URLs。同 Url::to() 一樣。

列表
無序列表可以如下生成:

<?= Html::ul($posts, ['item' => function($item, $index) {
    return Html::tag(
        'li',
        $this->render('post', ['item' => $item]),
        ['class' => 'post']
    );
}]) ?>
有序列表請使用 Html::ol() 方法。

Url 幫助類
Url 幫助類提供一系列的靜態方法來幫助管理 URL。

獲得通用 URL
有兩種獲取通用 URLS 的方法 :當前請求的 home URL 和 base URL 。爲了獲取 home URL ,使用如下代碼:

$relativeHomeUrl = Url::home();
$absoluteHomeUrl = Url::home(true);
$httpsAbsoluteHomeUrl = Url::home('https');
如果沒有傳任何參數,這個方法將會生成相對 URL 。你可以傳 true 來獲得一個針對當前協議的絕對 URL;或者,你可以明確的指定具體的協議類型( https , http )。

如下代碼可以獲得當前請求的 base URL:

`php$relativeBaseUrl = Url::base();$absoluteBaseUrl = Url::base(true);$httpsAbsoluteBaseUrl = Url::base('https');

 
這個方法的調用方式和 `Url::home()` 的完全一樣。
 
 
## 創建 URLs <span id="creating-urls"></span>
 
爲了創建一個給定路由的 URL 地址,請使用 `Url::toRoute()`方法。 這個方法使用 \yii\web\UrlManager 
來創建一個 URL :
 
```php
$url = Url::toRoute(['product/view', 'id' => 42]);
你可以指定一個字符串來作爲路由,如: site/index 。如果想要指定將要被創建的 URL 的附加查詢參數,你同樣可以使用一個數組來作爲路由。數組的格式須爲:

// generates: /index.php?r=site/index&param1=value1&param2=value2
['site/index', 'param1' => 'value1', 'param2' => 'value2']
如果你想要創建一個帶有 anchor 的 URL ,你可以使用一個帶有 # 參數的數組。比如:

// generates: /index.php?r=site/index&param1=value1#name
['site/index', 'param1' => 'value1', '#' => 'name']
一個路由既可能是絕對的又可能是相對的。一個絕對的路由以前導斜槓開頭(如: /site/index),而一個相對的路由則沒有(比如: site/index 或者 index)。一個相對的路由將會按照如下規則轉換爲絕對路由:

如果這個路由是一個空的字符串,將會使用當前 \yii\web\Controller::route 作爲路由;
如果這個路由不帶任何斜槓(比如 index ),它會被認爲是當前控制器的一個 action ID,然後將會把 \yii\web\Controller::uniqueId 插入到路由前面。
如果這個路由不帶前導斜槓(比如: site/index ),它會被認爲是相對當前模塊(module)的路由,然後將會把 \yii\base\Module::uniqueId 插入到路由前面。
從2.0.2版本開始,你可以用 alias 來指定一個路由。在這種情況下, alias 將會首先轉換爲實際的路由,然後會按照上述規則轉換爲絕對路由。

以下是該方法的一些例子:

// /index.php?r=site/index
echo Url::toRoute('site/index');
 
// /index.php?r=site/index&src=ref1#name
echo Url::toRoute(['site/index', 'src' => 'ref1', '#' => 'name']);
 
// /index.php?r=post/edit&id=100     assume the alias "@postEdit" is defined as "post/edit"
echo Url::toRoute(['@postEdit', 'id' => 100]);
 
// http://www.example.com/index.php?r=site/index
echo Url::toRoute('site/index', true);
 
// https://www.example.com/index.php?r=site/index
echo Url::toRoute('site/index', 'https');
還有另外一個方法 Url::to() 和 toRoute() 非常類似。這兩個方法的唯一區別在於,前者要求一個路由必須用數組來指定。如果傳的參數爲字符串,它將會被直接當做 URL 。

Url::to() 的第一個參數可以是:

數組:將會調用 toRoute() 來生成URL。比如:['site/index'], ['post/index', 'page' => 2] 。詳細用法請參考 toRoute() 。
帶前導 @ 的字符串:它將會被當做別名,對應的別名字符串將會返回。
空的字符串:當前請求的 URL 將會被返回;
普通的字符串:返回本身。
當 $scheme 指定了(無論是字符串還是 true ),一個帶主機信息(通過 \yii\web\UrlManager::hostInfo 獲得)的絕對 URL 將會被返回。如果 $url 已經是絕對 URL 了,它的協議信息將會被替換爲指定的( https 或者 http )。

以下是一些使用示例:

// /index.php?r=site/index
echo Url::to(['site/index']);
 
// /index.php?r=site/index&src=ref1#name
echo Url::to(['site/index', 'src' => 'ref1', '#' => 'name']);
 
// /index.php?r=post/edit&id=100     assume the alias "@postEdit" is defined as "post/edit"
echo Url::to(['@postEdit', 'id' => 100]);
 
// the currently requested URL
echo Url::to();
 
// /images/logo.gif
echo Url::to('@web/images/logo.gif');
 
// images/logo.gif
echo Url::to('images/logo.gif');
 
// http://www.example.com/images/logo.gif
echo Url::to('@web/images/logo.gif', true);
 
// https://www.example.com/images/logo.gif
echo Url::to('@web/images/logo.gif', 'https');
從2.0.3版本開始,你可以使用 yii\helpers\Url::current() 來創建一個基於當前請求路由和 GET 參數的 URL。你可以通過傳遞一個 $params 給這個方法來添加或者刪除 GET 參數。例如:

// assume $_GET = ['id' => 123, 'src' => 'google'], current route is "post/view"
 
// /index.php?r=post/view&id=123&src=google
echo Url::current();
 
// /index.php?r=post/view&id=123
echo Url::current(['src' => null]);
// /index.php?r=post/view&id=100&src=google
echo Url::current(['id' => 100]);
記住 URLs
有時,你需要記住一個 URL 並在後續的請求處理中使用它。你可以用以下方式達到這個目的:

// Remember current URL 
Url::remember();
 
// Remember URL specified. See Url::to() for argument format.
Url::remember(['product/view', 'id' => 42]);
 
// Remember URL specified with a name given
Url::remember(['product/view', 'id' => 42], 'product');
在後續的請求處理中,可以用如下方式獲得記住的 URL:

$url = Url::previous();
$productUrl = Url::previous('product');
檢查相對 URLs
你可以用如下代碼檢測一個 URL 是否是相對的(比如,包含主機信息部分)。

$isRelative = Url::isRelative('test/it');

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章