第一個程序HelloWord
說聲 Hello
本章節描述了如何在你的應用中創建一個新的 “Hello” 頁麵。為了做到這點,將會創建一個[操作]和一個[視圖]:
* 應用將會分派頁麵請求給操作
* 操作將會依次渲染視圖呈現 “Hello” 給最終用戶
貫穿整個章節,你將會掌握三件事:
1. 如何創建一個[操作]去響應請求,
2. 如何創建一個[視圖]去構造響應內容,
3. 以及一個應用如何分派請求給[操作]。
創建操作
為了說 “Hello”,需要創建一個 `say` [操作],從請求中接收 `message` 參數並顯示給最終用戶。如果請求冇有提供 `message` 參數,操作將顯示默認參數 “Hello”。> 補充:[操作]是最終用戶可以直接訪問並執行的對象。操作被組織在[控製器]中。一個操作的執行結果就是最終用戶收到的響應內容。
操作必須聲明在[控製器]中。為了簡單起見,你可以直接在 `SiteController` 控製器裡聲明 `say` 操作。這個控製器是由文件 `controllers/SiteController.php` 定義的。以下是一個操作的聲明:
<?php namespace app\controllers; use yii\web\Controller; class SiteController extends Controller { // ...其它代碼... public function actionSay($message = '你好') { return $this->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` 參數。<?php use yii\helpers\Html; ?> <?= 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 表單的頁麵。