yii2實戰教程之第一個Yii程序

作者:白狼 出處: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跨站攻擊。

下一節我們將要直接開講簡單的博客管理系統,本篇我們主要涉及的基本概念 操作、視圖、路由等,希望你能掌握透徹,有任何問題下方均可留言交流!

[考慮目前國內網站大部分採集文章十分頻繁,更有甚者不註明原文出處,原作者更希望看客們查看原文,以防有任何問題不能更新所有文章,避免誤導!]

查看原文

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