第一個程序HelloWord
說聲 Hello
本章節描述瞭如何在你的應用中創建一個新的 「Hello」 頁面。爲了做到這點,將會創建一個[操作]和一個[視圖]:
* 應用將會分派頁面請求給操作
* 操作將會依次渲染視圖呈現 「Hello」 給最終用戶
貫穿整個章節,你將會掌握三件事:
1. 如何創建一個[操作]去響應請求,
2. 如何創建一個[視圖]去構造響應內容,
3. 以及一個應用如何分派請求給[操作]。
創建操作
爲了說 「Hello」,需要創建一個 `say` [操作],從請求中接收 `message` 參數並顯示給最終用戶。如果請求沒有提供 `message` 參數,操作將顯示默認參數 「Hello」。
> 補充:[操作]是最終用戶可以直接訪問並執行的對象。操作被組織在[控制器]中。一個操作的執行結果就是最終用戶收到的響應內容。
操作必須聲明在[控制器]中。爲了簡單起見,你可以直接在 `SiteController` 控制器裏聲明 `say` 操作。這個控制器是由文件 `controllers/SiteController.php` 定義的。以下是一個操作的聲明:
render('say', \['message' => $message\]); } } 在上述 \`SiteController\` 代碼中,\`say\` 操作被定義爲 \`actionSay\` 方法。Yii 使用 \`action\` 前綴區分普通方法和操作。\`action\` 前綴後面的名稱被映射爲操作的 ID。 涉及到給操作命名時,你應該理解 Yii 如何處理操作 ID。操作 ID 總是被以小寫處理,如果一個操作 ID 由多個單詞組成,單詞之間將由連字符連接(如 \`create-comment\`)。操作 ID 映射爲方法名時移除了連字符,將每個單詞首字母大寫,並加上 \`action\` 前綴。 例子:操作 ID \`create-comment\` 相當於方法名 \`actionCreateComment\`。 上述代碼中的操作方法接受一個參數 \`$message\`,它的默認值是 \`「Hello」\`(就像你設置 PHP 中其它函數或方法的默認值一樣)。當應用接收到請求並確定由 \`say\` 操作來響應請求時,應用將從請求的參數中尋找對應值傳入進來。換句話說,如果請求包含一個 \`message\` 參數,它的值是 \`「Goodybye」\`, 操作方法中的 \`$message\` 變量也將被填充爲 \`「Goodbye」\`。 在操作方法中,\[\[yii\\web\\Controller::render()|render()\]\] 被用來渲染一個名爲 \`say\` 的\[視圖\](structure-views.md)文件。 \`message\` 參數也被傳入視圖,這樣就可以在裏面使用。操作方法會返回渲染結果。結果會被應用接收並顯示給最終用戶的瀏覽器(作爲整頁 HTML 的一部分)。 創建視圖 ----- \[視圖\]是你用來生成響應內容的腳本。爲了說 「Hello」,你需要創建一個 \`say\` 視圖,以便顯示從操作方法中傳來的 \`message\` 參數。 = Html::encode($message) ?>`say` 視圖應該存爲 `views/site/say.php` 文件。當一個操作中調用了 [[yii\web\Controller::render()|render()]] 方法時,它將會按 `views/控制器 ID/視圖名.php` 路徑加載 PHP 文件。
注意以上代碼,`message` 參數在輸出之前被 [[yii\helpers\Html::encode()|HTML-encoded]] 方法處理過。這很有必要,當參數來自於最終用戶時,參數中可能隱含的惡意 JavaScript 代碼會導致[跨站腳本(XSS)攻擊](http://en.wikipedia.org/wiki/Cross-site\_scripting)。
當然了,你大概會在 `say` 視圖裏放入更多內容。內容可以由 HTML 標籤,純文本,甚至 PHP 語句組成。實際上 `say` 視圖就是一個由 [[yii\web\Controller::render()|render()]] 執行的 PHP 腳本。視圖腳本輸出的內容將會作爲響應結果返回給應用。應用將依次輸出結果給最終用戶。
嘗試下
創建完操作和視圖後,你就可以通過下面的 URL 訪問新頁面了:
http://hostname/index.php?r=site/say&message=Hello+World
[Hello World]
這個 URL 將會輸出包含 「Hello World」 的頁面,頁面和應用裏的其它頁面使用同樣的頭部和尾部。
如果你省略 URL 中的 `message` 參數,將會看到頁面只顯示 「Hello」。這是因爲 `message` 被作爲一個參數傳給 `actionSay()` 方法,當省略它時,參數將使用默認的 `「Hello」` 代替。
> 補充:新頁面和其它頁面使用同樣的頭部和尾部是因爲 [[yii\web\Controller::render()|render()]] 方法會自動把 `say` 視圖執行的結果嵌入稱爲[佈局]的文件中,本例中是 `views/layouts/main.php`。
上面 URL 中的參數 `r` 需要更多解釋。它代表[路由],是整個應用級的,指向特定操作的獨立 ID。路由格式是 `控制器 ID/操作 ID`。應用接受請求的時候會檢查參數,使用控制器 ID 去確定哪個控制器應該被用來處理請求。然後相應控制器將使用操作 ID 去確定哪個操作方法將被用來做具體工作。上述例子中,路由 `site/say` 將被解析至 `SiteController` 控制器和其中的 `say` 操作。因此 `SiteController::actionSay()` 方法將被調用處理請求。
> 補充:與操作一樣,一個應用中控制器同樣有唯一的 ID。控制器 ID 和操作 ID 使用同樣的命名規則。控制器的類名源自於控制器 ID,移除了連字符,每個單詞首字母大寫,並加上 `Controller` 後綴。例子:控制器 ID `post-comment` 相當於控制器類名 `PostCommentController`。
總結
通過本章節你接觸了 MVC 設計模式中的控制器和視圖部分。創建了一個操作作爲控制器的一部分去處理特定請求。然後又創建了一個視圖去構造響應內容。在這個小例子中,沒有模型調用,唯一涉及到數據的地方是 `message` 參數。
你同樣學習了 Yii 路由的相關內容,它是用戶請求與控制器操作之間的橋樑。
下一章,你將學習如何創建一個模型,以及添加一個包含 HTML 表單的頁面。