作者:白狼 出處:http://www.manks.top/document/yii_first_application.html 本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
之前考慮過要不要砍掉該章節,直接上手教你搭建簡單的博客系統。出於實戰基礎加之自C語言的書籍出版以來,幾乎所有的編程書籍都講述了一個Hello World的例子作爲開始。雖然我們僅僅是學習Yii2,但是好歹我們這也是高大上的Yii嘛,我們也尊重傳統,來一段Hello World快速入門!
我將學會什麼
- 瞭解到MVC設計模式中的V和C是什麼
- 如何創建一個操作(action)
- 如何創建對應的視圖文件(模板)
- 簡單瞭解到操作的命名規範
- 什麼是路由
開始之前的準備
Yii是什麼?爲什麼要學Yii呢?是啥,就是一個框架,如果要加一些形容詞,我覺得高性能、易擴展等詞最適合不過了。
MVC相信就不用多說了,Yii2無疑更好的基於MVC對代碼進行了一定的組織。簡潔優雅不說……我們還是不拍yii馬屁了,說重點。
我們知道,客戶端像服務端發起一個請求,服務端是必須要有對應的響應地址纔是可以的。這個響應的地址在Yii2中又是怎麼進行描述的呢?先來介紹下什麼是操作。
操作,其實就是一個action(action是動作的意思),也可以描述爲我們前面說的響應地址。TA是控制器(controller)的組成部分,再說白了其實就是類(class)的操作方法(function)。
如何創建一個操作呢?給類創建一個方法你會不,非要說的那麼白才明白不是太好,對吧。
也就是說我們需要先有一個類(控制器)唄,沒錯!如下示例就是包含了兩個操作 index 和create的控制器test。
namespace frontend\controllers;
use yii\web\Controller;
class TestController extends Controller {
public function actionIndex () {
}
public function actionCreate () {
}
}
有同學要較真了,控制器不是test嗎,爲啥你的是TestController?還有啊,說好的操作名是index和create爲啥你的都有前綴action?controller跟action去掉可不可以?答:不可以,必須帶上!Yii2規定:聲明的控制器必須帶上Controller後綴,同時操作必須帶上前綴action!
通常情況下,控制器用來處理請求有關的資源類型,其實就是做一些操作的,比如我們要處理文章之類的數據,控制器應命名爲Article恰當些,儘量做到見名知意。Action當然也是如此,比如我們要創建一篇文章,action理應爲add或者create爲妙。
那有同學要說了,我就想叫操作名爲createArticle怎麼辦?天兒熱,先涼拌着,慢慢說。
yii2中操作名(action)遵循駝峯式命名,也就是說如果你是多個單詞,請保證你的命名規則是actionCreateArticle而不是actionCreatearticle!當然,這只是一種規範,你不這樣做也沒人攔你。需要提醒注意的是多個單詞駝峯式命名,訪問操作的時候,多個單詞需要像create-article這樣用連接符連接而不是createArticle哦
接下來我們訪問已經創建好的操作:
首先我們先配置下域名advanced.dev指向\frontend\web目錄,我們後文所指的該域名均指向這裏
在frontend\controllers\目錄下新建TestController.php文件,內容參考上面我們創建Test控制器的代碼
地址欄輸入 http://advanced.dev/index.php?r=test/index 訪問看看結果,我們會發現一片空白,什麼也沒有!很明顯,我們的的操作方法index裏空空如也,沒做任何輸出。要不我們做點什麼?別急,我們先來看看這個地址,TA究竟做了什麼,爲什麼能請求到我們指定的操作。
這就需要我們引入一個新的概念-路由。感覺挺好哈,這名字都沒聽過。不過不要緊,我換個說法你就明白了,訪問地址,路由就是我們的訪問地址!明白了吧,TA就是用於定位控制器操作的地址!我們這裏重點是講明白概念,不做深究,具體細節需要的可以去查看官方文檔。
輸出Hello World!
該明白的該說的都說了,饒了一大圈終於該說本篇文章的重點了-輸出Hello World。艾瑪,可把我憋壞了。
public function actionIndex () {
echo "Hello World!";
}
現在在回過來看看,是不是很簡單!
我們改變點什麼,看看如何動態的輸出Hello Ketty,Hello Anmy?
public function actionIndex ($name) {
echo "Hello {$name}!";
}
該操作方法接收一個參數name,理應程序上會輸出Hello, xxx的字樣。
現在我們依然訪問 http://advanced.dev/index.php?r=test/index 會發現頁面報錯了,提示錯誤缺少參數:name!也就是說,我們訪問該操作時應該傳進來一個參數name!我們把地址修改爲 http://advanced.dev/index.php?r=test/index&name=Kitty ,這個時候頁面正常輸出了Hello Kitty!手動修改地址欄的name值,頁面上輸出的內容也會隨之進行改變!
我們知道,操作其實就類似MVC中的C層,C層也就是處理業務邏輯的一層,如此一來,像上面在控制器的操作方法中輸出內容明顯就不太合適了。
既然要輸出內容,我們看看Yii2的V層又是如何進行操作(此操作非彼操作,不要妄加揣摩)的呢?
我們引入新的概念-視圖。視圖是啥?說白了就是我們的模版文件。我們先在frontend\views\新建文件夾test,然後在test下創建一個視圖文件index.php,文件內容如下
<div class="test-index">
<h1>Hello World!</h1>
</div>
說明一點:frontedn\views下面創建的文件夾應與控制器保持一致,如此一來才方便我們對很多文件進行管理。
接下來看看如何才能對視圖index.php進行操作?
public function actionIndex ($name) {
// echo "Hello {$name}!";
return $this->render('index');
}
僅僅是在之前的操作index內寫了一行代碼,用於操作視圖文件。此時我們很有必要在視圖文件內動態輸出Hello xxx!這個時候只需要在render方法傳遞參數即可。
// controller public function actionIndex ($name) {
// echo "Hello {$name}!";
return $this->render('index', [
'name' => $name,
]);
}
//view
<div class="test-index">
<h1>Hello <?= $name ?>!</h1>
</div>
如此一來,我們既掌握了視圖,又實現了我們想要輸出的Hello xxx!
但是,這個時候,如果我們地址欄輸入的參數name值等於,我們想要的結果是Hello !實際上並非如此!如此一來,就難免會遭遇XSS攻擊!爲了安全起見,頁面上輸出的信息我們很有必要安全地處理一下!
<div class="test-index">
<h1>Hello <?= yii\helpers\Html::encode($name) ?>!</h1>
</div>
實際上這裏我們也僅僅是簡單的談了一下如何避免XSS跨站攻擊。
下一節我們將要直接開講簡單的博客管理系統,本篇我們主要涉及的基本概念 操作、視圖、路由等,希望你能掌握透徹,有任何問題下方均可留言交流!
[考慮目前國內網站大部分採集文章十分頻繁,更有甚者不註明原文出處,原作者更希望看客們查看原文,以防有任何問題不能更新所有文章,避免誤導!]