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

以前考慮過要不要砍掉該章節,直接上手教你搭建簡單的博客系統。出於實戰基礎加之自C語言的書籍出版以來,幾乎全部的編程書籍都講述了一個Hello World的例子做爲開始。雖然咱們僅僅是學習Yii2,可是好歹咱們這也是高大上的Yii嘛,咱們也尊重傳統,來一段Hello World快速入門!
我將學會什麼php

  • 瞭解到MVC設計模式中的V和C是什麼
  • 如何建立一個操做(action)
  • 如何建立對應的視圖文件(模板)
  • 簡單瞭解到操做的命名規範
  • 什麼是路由

開始以前的準備
Yii是什麼?爲何要學Yii呢?是啥,就是一個框架,若是要加一些形容詞,我以爲高性能、易擴展等詞最適合不過了。html

MVC相信就不用多說了,Yii2無疑更好的基於MVC對代碼進行了必定的組織。簡潔優雅不說......咱們仍是不拍yii馬屁了,說重點。web

咱們知道,客戶端像服務端發起一個請求,服務端是必需要有對應的響應地址纔是能夠的。這個響應的地址在Yii2中又是怎麼進行描述的呢?先來介紹下什麼是操做。編程

操做,其實就是一個action(action是動做的意思),也能夠描述爲咱們前面說的響應地址。TA是控制器(controller)的組成部分,再說白了其實就是類(class)的操做方法(function)。設計模式

如何建立一個操做呢?給類建立一個方法你會不,非要說的那麼白才明白不是太好,對吧。安全

也就是說咱們須要先有一個類(控制器)唄,沒錯!以下示例就是包含了兩個操做 index 和create的控制器test。yii2

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!app

一般狀況下,控制器用來處理請求有關的資源類型,其實就是作一些操做的,好比咱們要處理文章之類的數據,控制器應命名爲Article恰當些,儘可能作到見名知意。Action固然也是如此,好比咱們要建立一篇文章,action理應爲add或者create爲妙。框架

那有同窗要說了,我就想叫操做名爲createArticle怎麼辦?天兒熱,先涼拌着,慢慢說。frontend

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跨站攻擊。

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

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

查看原文

相關文章
相關標籤/搜索